question about a line.

rodead

Active Member
Reaction score
42
well i have a spell and you can cast it on a unit then there comes a virtual line i use the spell arial shakles and if you walk between the unit and caster you need to get a buff but how do i detect if a unit walks trough that line...

i tried with X and Y of both points of the units but then i came to the conclusion i can't use less then and bigger then because then you need to enter a value and i don't know any value.


thanks in advanced and +rep if you help me!
 

AceHart

Your Friendly Neighborhood Admin
Reaction score
1,495
Your math is rather solid, right? :p

Imagine a circle with your two units as diameter.
Pick all units within.

The distance of a point (x, y) to a line through two points (x1, y1) and (x2, y2) is given by:
Abs( (x2 -x1) * (y1 - y) - (x1 - x) * (y2 - y1) ) / SquareRoot( (x2 -x1)^2 + (y2 - y1)^2 )

To be done periodically.


Good luck.
 

AceHart

Your Friendly Neighborhood Admin
Reaction score
1,495
> Imagine a circle with your two units as diameter.

The two units:
u1 - the caster
u2 - the target (or wherever your second unit is coming from)

Point "in the middle":
xp = (GetUnitX(u1) + GetUnitX(u2)) * 0.5
yp = (GetUnitY(u1) + GetUnitY(u2)) * 0.5

Radius, distance from "middle" to one of the units:
r = SquareRoot((xp - x) * (xp - x) + (yp - y) * (yp - y))

> Pick all units within.

Easy enough, there's a ready to use GroupEnum that gets units within a given distance to a point:
GroupEnumUnitsInRange(group, xp, yp, r, filter)
"filter" being your usual condition function, like "is an enemy" or whatever you need there.


> The distance of a point (x, y) to a line through two points (x1, y1) and (x2, y2) is given by:
> Abs( (x2 -x1) * (y1 - y) - (x1 - x) * (y2 - y1) ) / SquareRoot( (x2 -x1)^2 + (y2 - y1)^2 )

This is hairier.
And needs to be done for each unit found previously.
As such, it should not do the entire calculation for each one...

Things to note:
- x1, y1, x2 and y2 are fixed, they don't change on a given run
- the absolute value can be dealt with "later"

s = SquareRoot( (x2 -x1)^2 + (y2 - y1)^2 )
Can be calculated in advance.

x2 - x1 and y2 - y1 are constant too.

a = x2 - x1
b = y2 - y1

The distance then simplifies to
d = (a * (y1 - y) - b * (x1 - x)) / s

Which can be optimized further:
a1 = a / s
b1 = b / s


I.e. inside the loop that checks the units, all that's left is:

loop
- get a unit from the group: u
d = a1 * (y1 - GetUnitY(u)) - b * (x1 - GetUnitX(u))
If d >= -distance and d <= distance then
- the unit is near enough, do something
endloop

With distance some constant. Like 80 or so... depends on how close you want the units to be to be counted as "near enough".
 

rodead

Active Member
Reaction score
42
> Imagine a circle with your two units as diameter.

The two units:
u1 - the caster
u2 - the target (or wherever your second unit is coming from)

Point "in the middle":
xp = (GetUnitX(u1) + GetUnitX(u2)) * 0.5
yp = (GetUnitY(u1) + GetUnitY(u2)) * 0.5


this is what i did but then i got again a question over the next part, you make the r a variable right? how would i ever add a unknown value to a variable.


Radius, distance from "middle" to one of the units:
r = SquareRoot((xp - x) * (xp - x) + (yp - y) * (yp - y))

i got now this:
Code:
Set Holy_Shakles_Real_3[(Player number of (Owner of (Casting unit)))] = (Square root(((Min(Holy_Shakles_Real_1[(Player number of (Owner of (Casting unit)))], (X of (Center of (Playable map area))))) x ((Min(Holy_Shakles_Real_1[(Player number of (Owner of (Casting unit)))], (X of (Center of (Playable map area))))) + ((Min(Holy_Sha

holy shakles 1 is Xp and holy shakles 2 is Yp
 

AceHart

Your Friendly Neighborhood Admin
Reaction score
1,495
> how would I ever add an unknown value to a variable?

It isn't unknown.
It's the position of one of your units, either the caster or the target.
And what it tries to find there is the distance from the middle to one of the units.


What's that "Min" doing there?
 

rodead

Active Member
Reaction score
42
ehmm i don't know i tought min is minus= - so the same? but as i pmed you maybe we can better talk on aim or msn or whatever. because i am to bussy with maths of my school for next weeks exams. and it talks some easier...
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Members online

      No members online now.

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top