We are about to switch to a new forum software. Until then we have removed the registration on this forum.

- All Categories 25.7K
- Announcements & Guidelines 13
- Common Questions 30
- Using Processing 22.1K
- Programming Questions 12.2K
- Questions about Code 6.4K
- How To... 4.2K
- Hello Processing 72
- GLSL / Shaders 292
- Library Questions 4K
- Hardware, Integration & Other Languages 2.7K
- Kinect 661
- Arduino 1K
- Raspberry PI 187
- Questions about Modes 2K
- Android Mode 1.3K
- JavaScript Mode 413
- Python Mode 205
- Questions about Tools 100
- Espanol 5
- Developing Processing 548
- Create & Announce Libraries 211
- Create & Announce Modes 19
- Create & Announce Tools 29
- Summer of Code 2018 93
- Rails Girls Summer of Code 2017 3
- Summer of Code 2017 49
- Summer of Code 2016 4
- Summer of Code 2015 40
- Summer of Code 2014 22
- p5.js 1.6K
- p5.js Programming Questions 947
- p5.js Library Questions 315
- p5.js Development Questions 31
- General 1.4K
- Events & Opportunities 289
- General Discussion 365

I would delete this post but it appears there isn’t a way to do that.

The original post:

I am trying to make a function that determines whether two line segments intersect. (I’m creating a program that involves figuring out whether a given point is inside a polygon.) The function is a method of the `LineSegment`

class that inputs another `LineSegment l`

, (that’s a lowercase L, not a 1) and figures out whether they intersect. It outputs `0`

or `1`

instead of `False`

or `True`

for reasons that are unimportant here. Here it is:

```
def intersects( self, l ):
lx1 = l.get_x1() # The x-coordinate of the first endpoint of l
lx2 = l.get_x2() # The x-coordinate of the second endpoint of l
ly1 = l.get_y1() # The y-coordinate of the first endpoint of l
ly2 = l.get_y2() # The y-coordinate of the second endpoint of l
lm = l.get_m() # The slope of l
lb = l.get_b() # The y-intercept of l
'''self.m is the slope of this line, self.b is the y-intercept of this line, self.x1 is the x-coordinate of the first
endpoint of this line, etc.
if self.m == lm: # If the slopes are the same — i.e. the lines are parallel — they don’t intersect
return 0
else: # If the lines aren’t parallel:
ix = iy = 0 # ix will be the x coordinate of the intersection point; iy will be the y coordinate
if self.m == 'vertical': # If this line (self) is vertical (we need this condition because slope-intercept form doesn’t
work with vertical lines)
ix = self.x1 # The x-coordinate of the intersection point is just the x coordinate of this line, because it’s vertical
iy = lm * ix + lb # Plug that into the other equation to find the y coordinate
elif lm == 'vertical': # The reverse — if l is vertical
ix = lx1
iy = self.m * ix + self.b
else: # Otherwise, solve for the intersection point
ix = ( lb - self.b ) / ( self.m - lm )
iy = self.m * ix + self.b
# I have tested this and everything up to here works — it always finds the correct intersection point. However, we
still have to make sure the intersection point isn’t outside either segment. We do this by seeing whether the
x-coordinate of the intersection, ix, is between self.x1 and self.x2 and also between lx1 and lx2, and whether
the y-coordinate of the intersection, iy, is between self.y1 and self.y2 and also between ly1 and ly2.
if ( self.x1 <= ix <= self.x2 or self.x2 <= ix <= self.x1 ) and \
( lx1 <= ix <= lx2 or lx2 <= ix <= lx1 ) and \
( self.y1 <= iy <= self.y2 or self.y2 <= iy <= self.y1 ) and \
( ly1 <= iy <= ly2 or ly2 <= iy <= ly1 ):
return 1
else:
return 0
```

This works. However, I then realized that I wanted to go into more detail — I want method to output 0 if they don’t intersect and 1 if they do, but if the intersection point *lies on the endpoint* of one (or both) of the segments — i.e. they intersect in a T or L shape — it should output 0.5. I thought I would go about this by first testing whether they “strictly intersect” — i.e. they intersect in an X, not a T or an L — and if they do, output 1; if they don’t, then proceed from there. Here’s how I thought to test for “strict intersection” — just make all the inequalities strict:

```
if ( self.x1 < ix < self.x2 or self.x2 < ix < self.x1 ) and \
( lx1 < ix < lx2 or lx2 < ix < lx1 ) and \
( self.y1 < iy < self.y2 or self.y2 < iy < self.y1 ) and \
( ly1 < iy < ly2 or ly2 < iy < ly1 ):
...
```

For some reason, this is *never* true — I’ve tested this by putting something like `print( 'hi' )`

after this `if`

statement and the program prints nothing (even when the intersection point is obviously not an endpoint of a line). Why is this?