Question:
I have been looking for some guidance on a geometry problem I have 2 segments that lie on the same line and I want to clip both based on any of the boolean operationsUnion, Intersection, Difference, Difference-Rev, Xor
The expected result should be a list of segments because cases can return 0,1 or 2 segmentsin my current approach, I define a segment as a pair of 2 numbers (coordinates) on the same line
Segment 1 : (2,13)
Segment 2: (8,16)
my first step is make an array of sorted pointspoints = [2, 8, 13, 16]
second is iterate and label the points by their ownerSegment 1, Segment 2 or Both
Finally, I need to do a selection given a boolean operation and the labelsBut currently I’m stuck on the second step and I don’t know how to find the labels and then do the selection given the boolean operation, any help ?

Answer:
Put triplets[coordinate, begin/end, segment number]
in the list.Sort the list.
Walk through the list. At every point change a
code
adding or subtracting segment number. So code=3
denotes segement intersection, code=1
corresponds to the first segment only range.Form resulting ranges depending on operation required and
code
change. Here I just enumerated operations in your list order.I’m not sure what to do when end of one segment coinsides with beginning of another. Current sorting puts
end
before begin
, so union will give two separate ranges. If needed, change sign of begin/end field and make code -= p[1] * p[2]
Python code:
def boolops(s1, s2, op):
pts = [[s1[0], 1, 1], [s1[1], -1, 1],[s2[0], 1, 2],[s2[1], -1, 2]]
pts.sort()
#print(pts)
res = []
code = 0
oldcode = 0
start = -1
for p in pts:
code += p[1] * p[2]
#print(oldcode, code)
if op == 0: # union
if oldcode == 0 and code:
start = p[0]
elif oldcode and code == 0:
res.append([start, p[0]])
elif op == 1: #intersection
if code == 3:
start = p[0]
elif oldcode == 3:
res.append([start, p[0]])
elif op == 2: #diff s1-s2
if code == 1:
start = p[0]
elif oldcode == 1:
res.append([start, p[0]])
elif op == 3: #rev diff s2-s1
if code == 2:
start = p[0]
elif oldcode == 2:
res.append([start, p[0]])
elif op == 4: #xor
if code % 3 > 0:
start = p[0]
else:
res.append([start, p[0]])
oldcode = code
return res
print(boolops([2,10],[5,12], 0))
print(boolops([2,5],[10,12], 0))
print(boolops([2,10],[5,12], 1))
print(boolops([2,5],[10,12], 1))
print(boolops([2,10],[5,12], 2))
print(boolops([2,5],[10,12], 2))
print(boolops([2,10],[5,12], 3))
print(boolops([2,5],[10,12], 3))
print(boolops([2,10],[5,12], 4))
print(boolops([2,5],[10,12], 4))
[2, 12]] #union
[[2, 5], [10, 12]]
[[5, 10]] #intersection
[]
[[2, 5]] #diff
[[2, 5]]
[[10, 12]] #revdiff
[[10, 12]]
[[2, 5], [10, 12]] #xor
[[2, 5], [10, 12]]
#full coverage tests
print(boolops([2,5],[1,6], 0))
print(boolops([2,5],[1,6], 1))
print(boolops([2,5],[1,6], 2))
print(boolops([2,5],[1,6], 3))
print(boolops([2,5],[1,6], 4)
[[1, 6]]
[[2, 5]]
[]
[[1, 2], [5, 6]]
[[1, 2], [5, 6]]
)If you have better answer, please add a comment about this, thank you!
Leave a Review