Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; Get required inclusions at: ;
- ; https://pastebin.com/s6HubNPb ;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- on 1:text:!collision *:#: {
- if ($0 < 9) {
- msg $chan Error: You must specifiy 8 coordinates for 4 points of 2 line segements.
- return
- }
- tokenize 32 $replace($2-,$chr(44),$chr(32),$chr(40),$chr(32),$chr(41),$chr(32))
- var %x 1
- while (%x <= $0) {
- if ([ $ $+ [ %x ] ] !isnum) {
- msg $chan Error: You have specified a non-number input as coordinate %x $+ .
- return
- }
- inc %x
- }
- var %projectile1 $LineSegement
- var %projectile2 $LineSegement
- - $LineSegement(%projectile1,$1,$2).SetStartCoordinates
- - $LineSegement(%projectile1,$3,$4).SetEndCoordinates
- - $LineSegement(%projectile2,$5,$6).SetStartCoordinates
- - $LineSegement(%projectile2,$7,$8).SetEndCoordinates
- var %return $DistanceBetweenProjectiles(%projectile1, %projectile2)
- var %distance $token($token(%return,1,124),2,58)
- var %ratio $token($token(%return,2,124),2,58)
- var %distanceCoordinates $CalculatePointsFromRatio(%ratio, %projectile1, %projectile2)
- var %projectile1CollisionCoordinates $+($chr(40),$token($token(%distanceCoordinates,1,43),1,58),$chr(44),$chr(32),$token($token(%distanceCoordinates,1,43),2,58),$chr(41))
- var %projectile2CollisionCoordinates $+($chr(40),$token($token(%distanceCoordinates,2,43),1,58),$chr(44),$chr(32),$token($token(%distanceCoordinates,2,43),2,58),$chr(41))
- msg $chan Distance from collision: %distance $+ $chr(44) Time of nearest distance: $+(%ratio seconds) Coordinates: $+(Line,$chr(40), %projectile1CollisionCoordinates,$chr(44), $chr(32), %projectile2CollisionCoordinates,$chr(41))
- - $class(%projectile1,1).delete
- - $class(%projectile2,1).delete
- }
- alias TestAge {
- var %line1 $linesegement
- var %line2 $linesegement
- - $LineSegement(%line1,328,111).SetStartCoordinates
- - $LineSegement(%line1,133,342).SetEndCoordinates
- - $LineSegement(%line2,131,472).SetStartCoordinates
- - $LineSegement(%line2,49,394).SetEndCoordinates
- var %return $CalculatePointsFromRatio(1,%line1,%line2)
- - $class(%line1,1).delete
- - $class(%line2,1).delete
- return %return
- }
- alias CalculatePointsFromRatio {
- var %ratio $1
- var %projectile1 $2
- var %projectile2 $$3
- var %projectile1PointStart $lineSegement(%projectile1).GetStartPoint
- var %Projectile1PointEnd $lineSegement(%projectile1).GetEndPoint
- var %projectile2PointStart $lineSegement(%projectile2).GetStartPoint
- var %Projectile2PointEnd $lineSegement(%projectile2).GetEndPoint
- var %projectile1Width $calc((($point(%projectile1PointEnd,1).GetCoordinate - $point(%projectile1PointStart,1).GetCoordinate) * %ratio) + $point(%projectile1PointStart,1).GetCoordinate)
- var %projectile1Height $calc((($point(%projectile1PointEnd,2).GetCoordinate - $point(%projectile1PointStart,2).GetCoordinate) * %ratio) + $point(%projectile1PointStart,2).GetCoordinate)
- var %projectile2Width $calc((($point(%projectile2PointEnd,1).GetCoordinate - $point(%projectile2PointStart,1).GetCoordinate) * %ratio) + $point(%projectile2PointStart,1).GetCoordinate)
- var %projectile2Height $calc((($point(%projectile2PointEnd,2).GetCoordinate - $point(%projectile2PointStart,2).GetCoordinate) * %ratio) + $point(%projectile2PointStart,2).GetCoordinate)
- var %return $+(%projectile1Width,:,%projectile1Height,+,%projectile2Width,:,%projectile2Height)
- + Projectile2PointStart: $point(%projectile2PointStart).GetCoordinates
- + Projectile2PointEnd: $point(%projectile2PointEnd).GetCoordinates
- + Return: %return
- + $crlf
- return %return
- }
- alias DistanceBetweenProjectiles {
- var %lineA $1
- var %lineB $$2
- var %lineAStart $LineSegement(%lineA).GetStartPoint
- var %lineAEnd $LineSegement(%lineA).GetEndPoint
- var %lineBStart $LineSegement(%lineB).GetStartPoint
- var %lineBEnd $LineSegement(%lineB).GetEndPoint
- var %offsetB $Point
- - $Point(%offsetB,$calc($Point(%lineAEnd,1).GetCoordinate - $Point(%lineAStart,1).GetCoordinate), $calc($Point(%lineAEnd,2).GetCoordinate - $Point(%lineAStart,2).getCoordinate)).SetCoordinates
- var %offsetD $Point
- - $Point(%offsetD,$calc($Point(%lineBStart,1).GetCoordinate - $Point(%lineBEnd,1).GetCoordinate), $calc($Point(%lineBStart,2).GetCoordinate - $Point(%lineBEnd,2).getCoordinate)).SetCoordinates
- var %f $Point
- - $Point(%f, $calc($point(%lineAEnd, 1).GetCoordinate + $point(%offsetD, 1).GetCoordinate), $calc($point(%lineAEnd, 2).GetCoordinate + $point(%offsetD, 2).GetCoordinate)).SetCoordinates
- var %g $Point
- - $Point(%g, $calc($point(%lineAStart,1).GetCoordinate - $point(%offsetD,1).GetCoordinate), $calc($point(%lineAStart,2).GetCoordinate - $point(%offsetD,2).GetCoordinate)).SetCoordinates
- var %i $getProjectedPointOnLine(%f, %lineAStart, %lineBStart)
- var %j $getProjectedPointOnLine(%g, %lineAEnd, %lineBEnd)
- var %k $Point
- - $Point(%k, $Point(%lineBStart).GetCoordinates).SetCoordinates
- - $Point(%k, %i).Subtract
- var %l $Point
- - $point(%l, $Point(%lineBEnd).GetCoordinates).SetCoordinates
- - $point(%l,%j).Subtract
- var %distance 0
- if ($sqrt($abs($calc($point(%k,1).GetCoordinate ^ 2 + $point(%k,2).GetCoordinate ^ 2))) < $sqrt($abs($calc($point(%l,1).GetCoordinate ^ 2 + $point(%l,2).GetCoordinate ^ 2)))) {
- %distance = $getLineDistance(%lineBStart, %i)
- }
- else {
- %distance = $getLineDistance(%lineBEnd, %j)
- }
- var %lineRatioA $getLineRatio(%lineAStart, %i, %f)
- var %lineRatioB $getLineRatio(%lineAEnd, %j, %g)
- var %lineRatio %lineRatioA
- if ($calc($round(%lineRatioA,5) + $round(%lineRatioB,5)) > 1.0f) {
- if ($round(%lineRatioA,5) < $round(%lineRatioB,5)) {
- %lineRatio = $calc(0 - %lineRatioA)
- %lineRatioA = lineRatio
- }
- else {
- %lineRatio = $calc(0 - %lineRatioB)
- %LineRatioB = %lineRatio
- }
- }
- if (%lineRatio <= 0 || %lineRatio >= 1) {
- if ($getLineDistance(%lineAEnd, %lineBEnd) < $getLineDistance(%lineAStart, %lineBStart)) {
- %lineRatio = 1
- %distance = $getLineDistance(%lineAEnd, %lineBEnd)
- }
- else {
- %lineRatio = 0
- %distance = $getLineDistance(%lineAStart, %lineBStart)
- }
- }
- - $class(%l).delete
- - $class(%k).delete
- - $class(%i).delete
- - $class(%j).delete
- - $class(%g).delete
- - $class(%f).delete
- - $class(%offsetB).delete
- - $class(%offsetD).delete
- return $+(distance,:,%distance,|,ratio,:,%lineRatio)
- }
- alias getProjectedPointOnLine {
- var %point1 $1, %point2 $2, %point3 $$3
- var %e1 $Point, %e2 $Point
- - $Point(%e1,$calc($point(%point2,1).GetCoordinate - $point(%point1,1).GetCoordinate ),$calc($point(%point2,2).GetCoordinate - $point(%point1,2).GetCoordinate)).SetCoordinates
- - $Point(%e2,$calc($point(%point3,1).GetCoordinate - $point(%point1,1).GetCoordinate ),$calc($point(%point3,2).GetCoordinate - $point(%point1,2).GetCoordinate)).SetCoordinates
- var %valDp $calc(($point(%e1,1).GetCoordinate * $point(%e2,1).GetCoordinate) + ($point(%e1,2).GetCoordinate * $point(%e2,2).GetCoordinate))
- var %lenLineE1 $sqrt($calc($point(%e1,1).GetCoordinate ^ 2 + $point(%e1,2).GetCoordinate ^ 2))
- var %lenLineE2 $sqrt($calc($point(%e2,1).GetCoordinate ^ 2 + $point(%e2,2).GetCoordinate ^ 2))
- var %cos $calc(%valDp / (%lenLineE1 * %lenLineE2))
- var %projLenOfLine $calc(%cos * %lenLineE2)
- var %return $Point
- - $Point(%return, $calc(($point(%point1,1).GetCoordinate + (%projLenOfLine * $point(%e1,1).GetCoordinate) / %lenLineE1)), $calc(($point(%point1,2).GetCoordinate + (%projLenOfLine * $point(%e1,2).GetCoordinate) / %lenLineE1))).SetCoordinates
- - $class(%e1).delete
- - $class(%e2).delete
- return %return
- }
- alias getLineRatio {
- var %a $1, %f $2, %j $$3
- var %distAX $calc($point(%a,1).GetCoordinate - $point(%j,1).GetCoordinate)
- var %distAY $calc($point(%a,2).GetCoordinate - $point(%j,2).GetCoordinate)
- var %distBX $calc($point(%a,1).GetCoordinate - $point(%f,1).GetCoordinate)
- var %distBY $calc($point(%a,2).GetCoordinate - $point(%f,2).GetCoordinate)
- var %sqrtA $sqrt($calc(%distBX ^ 2 + %distBY ^ 2))
- var %sqrtB $sqrt($calc(%distAX ^ 2 + %distAY ^ 2))
- if (%sqrtB == 0) return 0
- return $calc(%sqrtA / %sqrtB)
- }
- alias getLineDistance {
- var %a $1, %b $$2
- var %testx $calc($point(%a,1).GetCoordinate - $point(%b,1).GetCoordinate)
- var %testy $calc($point(%a,2).GetCoordinate - $point(%b,2).GetCoordinate)
- return $sqrt($calc(%testx ^ 2 + %testy ^ 2))
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement