Advertisement
Guest User

Projectile nearest distance to collision

a guest
Jan 22nd, 2020
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
mIRC 8.42 KB | None | 0 0
  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ; Get required inclusions at:      ;
  3. ; https://pastebin.com/s6HubNPb    ;
  4. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  5. on 1:text:!collision *:#: {
  6.   if ($0 < 9) {
  7.     msg $chan Error: You must specifiy 8 coordinates for 4 points of 2 line segements.
  8.     return
  9.   }
  10.  
  11.  
  12.   tokenize 32 $replace($2-,$chr(44),$chr(32),$chr(40),$chr(32),$chr(41),$chr(32))
  13.  
  14.  
  15.   var %x 1
  16.   while (%x <= $0) {
  17.     if ([ $ $+ [ %x ] ] !isnum) {
  18.       msg $chan Error: You have specified a non-number input as coordinate %x $+ .
  19.       return
  20.     }
  21.     inc %x
  22.   }
  23.  
  24.  
  25.   var %projectile1 $LineSegement
  26.   var %projectile2 $LineSegement
  27.  
  28.   - $LineSegement(%projectile1,$1,$2).SetStartCoordinates
  29.   - $LineSegement(%projectile1,$3,$4).SetEndCoordinates
  30.  
  31.   - $LineSegement(%projectile2,$5,$6).SetStartCoordinates
  32.   - $LineSegement(%projectile2,$7,$8).SetEndCoordinates
  33.  
  34.   var %return $DistanceBetweenProjectiles(%projectile1, %projectile2)
  35.  
  36.   var %distance $token($token(%return,1,124),2,58)
  37.   var %ratio $token($token(%return,2,124),2,58)
  38.   var %distanceCoordinates $CalculatePointsFromRatio(%ratio, %projectile1, %projectile2)
  39.  
  40.   var %projectile1CollisionCoordinates $+($chr(40),$token($token(%distanceCoordinates,1,43),1,58),$chr(44),$chr(32),$token($token(%distanceCoordinates,1,43),2,58),$chr(41))
  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))  
  42.  
  43.   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))
  44.   - $class(%projectile1,1).delete
  45.   - $class(%projectile2,1).delete
  46. }
  47.  
  48. alias TestAge {
  49.   var %line1 $linesegement
  50.   var %line2 $linesegement
  51.  
  52.   - $LineSegement(%line1,328,111).SetStartCoordinates
  53.   - $LineSegement(%line1,133,342).SetEndCoordinates
  54.  
  55.   - $LineSegement(%line2,131,472).SetStartCoordinates
  56.   - $LineSegement(%line2,49,394).SetEndCoordinates
  57.  
  58.   var %return $CalculatePointsFromRatio(1,%line1,%line2)
  59.  
  60.   - $class(%line1,1).delete
  61.   - $class(%line2,1).delete
  62.  
  63.   return %return
  64. }
  65.  
  66. alias CalculatePointsFromRatio {
  67.   var %ratio $1
  68.  
  69.   var %projectile1 $2
  70.   var %projectile2 $$3
  71.  
  72.   var %projectile1PointStart $lineSegement(%projectile1).GetStartPoint
  73.   var %Projectile1PointEnd $lineSegement(%projectile1).GetEndPoint
  74.  
  75.   var %projectile2PointStart $lineSegement(%projectile2).GetStartPoint
  76.   var %Projectile2PointEnd $lineSegement(%projectile2).GetEndPoint
  77.  
  78.   var %projectile1Width $calc((($point(%projectile1PointEnd,1).GetCoordinate - $point(%projectile1PointStart,1).GetCoordinate) * %ratio) + $point(%projectile1PointStart,1).GetCoordinate)
  79.   var %projectile1Height $calc((($point(%projectile1PointEnd,2).GetCoordinate - $point(%projectile1PointStart,2).GetCoordinate) * %ratio) + $point(%projectile1PointStart,2).GetCoordinate)
  80.  
  81.   var %projectile2Width $calc((($point(%projectile2PointEnd,1).GetCoordinate - $point(%projectile2PointStart,1).GetCoordinate) * %ratio) + $point(%projectile2PointStart,1).GetCoordinate)
  82.   var %projectile2Height $calc((($point(%projectile2PointEnd,2).GetCoordinate - $point(%projectile2PointStart,2).GetCoordinate) * %ratio) + $point(%projectile2PointStart,2).GetCoordinate)
  83.  
  84.  
  85.   var %return $+(%projectile1Width,:,%projectile1Height,+,%projectile2Width,:,%projectile2Height)
  86.   + Projectile2PointStart: $point(%projectile2PointStart).GetCoordinates
  87.   + Projectile2PointEnd: $point(%projectile2PointEnd).GetCoordinates
  88.   + Return: %return
  89.   + $crlf
  90.  
  91.   return %return
  92. }
  93.  
  94. alias DistanceBetweenProjectiles {
  95.   var %lineA $1
  96.   var %lineB $$2
  97.  
  98.   var %lineAStart $LineSegement(%lineA).GetStartPoint
  99.   var %lineAEnd $LineSegement(%lineA).GetEndPoint
  100.  
  101.   var %lineBStart $LineSegement(%lineB).GetStartPoint
  102.   var %lineBEnd $LineSegement(%lineB).GetEndPoint
  103.  
  104.   var %offsetB $Point
  105.   - $Point(%offsetB,$calc($Point(%lineAEnd,1).GetCoordinate - $Point(%lineAStart,1).GetCoordinate), $calc($Point(%lineAEnd,2).GetCoordinate - $Point(%lineAStart,2).getCoordinate)).SetCoordinates
  106.  
  107.   var %offsetD $Point
  108.   - $Point(%offsetD,$calc($Point(%lineBStart,1).GetCoordinate - $Point(%lineBEnd,1).GetCoordinate), $calc($Point(%lineBStart,2).GetCoordinate - $Point(%lineBEnd,2).getCoordinate)).SetCoordinates
  109.  
  110.   var %f $Point
  111.   - $Point(%f, $calc($point(%lineAEnd, 1).GetCoordinate + $point(%offsetD, 1).GetCoordinate),  $calc($point(%lineAEnd, 2).GetCoordinate + $point(%offsetD, 2).GetCoordinate)).SetCoordinates
  112.  
  113.   var %g $Point
  114.   - $Point(%g, $calc($point(%lineAStart,1).GetCoordinate - $point(%offsetD,1).GetCoordinate), $calc($point(%lineAStart,2).GetCoordinate - $point(%offsetD,2).GetCoordinate)).SetCoordinates
  115.  
  116.   var %i $getProjectedPointOnLine(%f, %lineAStart, %lineBStart)
  117.   var %j $getProjectedPointOnLine(%g, %lineAEnd, %lineBEnd)
  118.  
  119.   var %k $Point
  120.   - $Point(%k, $Point(%lineBStart).GetCoordinates).SetCoordinates
  121.   - $Point(%k, %i).Subtract
  122.   var %l $Point
  123.   - $point(%l, $Point(%lineBEnd).GetCoordinates).SetCoordinates
  124.   - $point(%l,%j).Subtract
  125.  
  126.   var %distance 0
  127.   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)))) {
  128.     %distance = $getLineDistance(%lineBStart, %i)
  129.   }
  130.   else {
  131.     %distance = $getLineDistance(%lineBEnd, %j)
  132.   }
  133.  
  134.   var %lineRatioA $getLineRatio(%lineAStart, %i, %f)
  135.   var %lineRatioB $getLineRatio(%lineAEnd, %j, %g)
  136.   var %lineRatio %lineRatioA
  137.  
  138.   if ($calc($round(%lineRatioA,5) + $round(%lineRatioB,5)) > 1.0f) {
  139.     if ($round(%lineRatioA,5) < $round(%lineRatioB,5)) {
  140.       %lineRatio = $calc(0 - %lineRatioA)
  141.       %lineRatioA = lineRatio  
  142.     }
  143.     else {
  144.       %lineRatio = $calc(0 - %lineRatioB)
  145.       %LineRatioB = %lineRatio
  146.     }
  147.   }
  148.   if (%lineRatio <= 0 || %lineRatio >= 1) {
  149.     if ($getLineDistance(%lineAEnd, %lineBEnd) < $getLineDistance(%lineAStart, %lineBStart)) {
  150.       %lineRatio = 1
  151.       %distance = $getLineDistance(%lineAEnd, %lineBEnd)
  152.     }
  153.     else {
  154.       %lineRatio = 0
  155.       %distance = $getLineDistance(%lineAStart, %lineBStart)
  156.     }
  157.   }
  158.  
  159.   - $class(%l).delete
  160.   - $class(%k).delete
  161.   - $class(%i).delete
  162.   - $class(%j).delete
  163.   - $class(%g).delete
  164.   - $class(%f).delete
  165.   - $class(%offsetB).delete
  166.   - $class(%offsetD).delete
  167.  
  168.   return $+(distance,:,%distance,|,ratio,:,%lineRatio)
  169. }
  170. alias getProjectedPointOnLine {
  171.   var %point1 $1, %point2 $2, %point3 $$3
  172.  
  173.   var %e1 $Point, %e2 $Point
  174.  
  175.   - $Point(%e1,$calc($point(%point2,1).GetCoordinate - $point(%point1,1).GetCoordinate ),$calc($point(%point2,2).GetCoordinate - $point(%point1,2).GetCoordinate)).SetCoordinates
  176.   - $Point(%e2,$calc($point(%point3,1).GetCoordinate - $point(%point1,1).GetCoordinate ),$calc($point(%point3,2).GetCoordinate - $point(%point1,2).GetCoordinate)).SetCoordinates
  177.  
  178.   var %valDp $calc(($point(%e1,1).GetCoordinate * $point(%e2,1).GetCoordinate) + ($point(%e1,2).GetCoordinate * $point(%e2,2).GetCoordinate))
  179.  
  180.   var %lenLineE1 $sqrt($calc($point(%e1,1).GetCoordinate ^ 2 + $point(%e1,2).GetCoordinate ^ 2))
  181.   var %lenLineE2 $sqrt($calc($point(%e2,1).GetCoordinate ^ 2 + $point(%e2,2).GetCoordinate ^ 2))
  182.  
  183.   var %cos $calc(%valDp / (%lenLineE1 * %lenLineE2))
  184.  
  185.   var %projLenOfLine $calc(%cos * %lenLineE2)
  186.  
  187.   var %return $Point
  188.   - $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
  189.  
  190.   - $class(%e1).delete
  191.   - $class(%e2).delete
  192.   return %return
  193. }
  194. alias getLineRatio {
  195.   var %a $1, %f $2, %j $$3
  196.  
  197.   var %distAX $calc($point(%a,1).GetCoordinate - $point(%j,1).GetCoordinate)
  198.   var %distAY $calc($point(%a,2).GetCoordinate - $point(%j,2).GetCoordinate)
  199.  
  200.   var %distBX $calc($point(%a,1).GetCoordinate - $point(%f,1).GetCoordinate)
  201.   var %distBY $calc($point(%a,2).GetCoordinate - $point(%f,2).GetCoordinate)
  202.  
  203.   var %sqrtA $sqrt($calc(%distBX ^ 2 + %distBY ^ 2))
  204.   var %sqrtB $sqrt($calc(%distAX ^ 2 + %distAY ^ 2))
  205.  
  206.   if (%sqrtB == 0) return 0
  207.  
  208.   return $calc(%sqrtA / %sqrtB)
  209. }
  210.  
  211. alias getLineDistance {
  212.   var %a $1, %b $$2
  213.   var %testx $calc($point(%a,1).GetCoordinate - $point(%b,1).GetCoordinate)
  214.   var %testy $calc($point(%a,2).GetCoordinate - $point(%b,2).GetCoordinate)
  215.   return $sqrt($calc(%testx ^ 2 + %testy ^ 2))
  216. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement