Work on paint bucketing algorithm
This commit is contained in:
parent
cd2899bb20
commit
148d9f1782
|
|
@ -123,9 +123,11 @@ def onMouseDownGroup(self, x, y,button=1,clicks=1):
|
||||||
for i in self.lines:
|
for i in self.lines:
|
||||||
if abs(self.cshape.endpoint1.x-i.endpoint1.x)<10 and abs(self.cshape.endpoint1.y-i.endpoint1.y)<10:
|
if abs(self.cshape.endpoint1.x-i.endpoint1.x)<10 and abs(self.cshape.endpoint1.y-i.endpoint1.y)<10:
|
||||||
self.cshape.connection1 = i.endpoint1
|
self.cshape.connection1 = i.endpoint1
|
||||||
|
self.cshape.connection1.lines.add(self.cshape)
|
||||||
break
|
break
|
||||||
elif abs(self.cshape.endpoint1.x-i.endpoint2.x)<10 and abs(self.cshape.endpoint1.y-i.endpoint2.y)<10:
|
elif abs(self.cshape.endpoint1.x-i.endpoint2.x)<10 and abs(self.cshape.endpoint1.y-i.endpoint2.y)<10:
|
||||||
self.cshape.connection1 = i.endpoint2
|
self.cshape.connection1 = i.endpoint2
|
||||||
|
self.cshape.connection1.lines.add(self.cshape)
|
||||||
break
|
break
|
||||||
self.lines.append(self.cshape)
|
self.lines.append(self.cshape)
|
||||||
return
|
return
|
||||||
|
|
@ -201,9 +203,11 @@ def onMouseUpGroup(self, x, y,button=1,clicks=1):
|
||||||
for i in self.lines:
|
for i in self.lines:
|
||||||
if abs(self.cshape.endpoint2.x-i.endpoint1.x)<10 and abs(self.cshape.endpoint2.y-i.endpoint1.y)<10:
|
if abs(self.cshape.endpoint2.x-i.endpoint1.x)<10 and abs(self.cshape.endpoint2.y-i.endpoint1.y)<10:
|
||||||
self.cshape.connection2 = i.endpoint1
|
self.cshape.connection2 = i.endpoint1
|
||||||
|
self.cshape.connection2.lines.add(self.cshape)
|
||||||
break
|
break
|
||||||
elif abs(self.cshape.endpoint2.x-i.endpoint2.x)<10 and abs(self.cshape.endpoint2.y-i.endpoint2.y)<10:
|
elif abs(self.cshape.endpoint2.x-i.endpoint2.x)<10 and abs(self.cshape.endpoint2.y-i.endpoint2.y)<10:
|
||||||
self.cshape.connection2 = i.endpoint2
|
self.cshape.connection2 = i.endpoint2
|
||||||
|
self.cshape.connection2.lines.add(self.cshape)
|
||||||
break
|
break
|
||||||
self.cshape = None
|
self.cshape = None
|
||||||
MainWindow.stage.draw()
|
MainWindow.stage.draw()
|
||||||
|
|
|
||||||
|
|
@ -96,8 +96,30 @@ def lastval(arr,index):
|
||||||
return i
|
return i
|
||||||
|
|
||||||
|
|
||||||
|
def angle_to_point(point1, point2):
|
||||||
|
deltaX = point2.x-point1.x
|
||||||
|
deltaY = point2.y-point1.y
|
||||||
|
angleInDegrees = math.atan2(-deltaY, deltaX) * 180 / math.pi
|
||||||
|
if angleInDegrees<0: angleInDegrees = 360+angleInDegrees
|
||||||
|
return angleInDegrees
|
||||||
|
|
||||||
|
def sqr(x) :
|
||||||
|
return x * x
|
||||||
|
def dist2(v, w):
|
||||||
|
return sqr(v.x - w.x) + sqr(v.y - w.y)
|
||||||
|
def distToSegmentSquared(p, v, w):
|
||||||
|
l2 = dist2(v, w)
|
||||||
|
if l2 == 0:
|
||||||
|
return dist2(p, v)
|
||||||
|
t = ((p.x - v.x) * (w.x - v.x) + (p.y - v.y) * (w.y - v.y)) / l2
|
||||||
|
if t < 0:
|
||||||
|
return dist2(p, v)
|
||||||
|
if t > 1:
|
||||||
|
return dist2(p, w)
|
||||||
|
return dist2(p, svlgui.Point(x=(v.x+t*(w.x-v.x)), y=(v.y+t*(w.y-v.y))))
|
||||||
|
|
||||||
|
def distToSegment(p, v, w):
|
||||||
|
return math.sqrt(distToSegmentSquared(p, v, w))
|
||||||
|
|
||||||
def catmullRom2bezier( points ) :
|
def catmullRom2bezier( points ) :
|
||||||
#crp = points.split(/[,\s]/);
|
#crp = points.split(/[,\s]/);
|
||||||
|
|
|
||||||
78
svlgui.py
78
svlgui.py
|
|
@ -2658,6 +2658,45 @@ class Group (object):
|
||||||
i.endpoint2.y = y
|
i.endpoint2.y = y
|
||||||
self.activepoint = i.endpoint2
|
self.activepoint = i.endpoint2
|
||||||
return
|
return
|
||||||
|
elif MODE=="b":
|
||||||
|
nlines = [i for i in self.lines]
|
||||||
|
endsleft = True
|
||||||
|
while endsleft:
|
||||||
|
endsleft = False
|
||||||
|
print nlines
|
||||||
|
for i in reversed(nlines):
|
||||||
|
if not (i.endpoint1 in [j.endpoint1 for j in nlines if not j==i]+[j.endpoint2 for j in nlines if not j==i]):
|
||||||
|
nlines.remove(i)
|
||||||
|
endsleft = True
|
||||||
|
elif not (i.endpoint2 in [j.endpoint1 for j in nlines if not j==i]+[j.endpoint2 for j in nlines if not j==i]):
|
||||||
|
nlines.remove(i)
|
||||||
|
endsleft = True
|
||||||
|
if nlines:
|
||||||
|
mindist = sys.maxint
|
||||||
|
point = Point(x, y)
|
||||||
|
closestsegment = None
|
||||||
|
for i in nlines:
|
||||||
|
d = misc_funcs.distToSegment(point,i.endpoint1,i.endpoint2)
|
||||||
|
if d<mindist:
|
||||||
|
mindist = d
|
||||||
|
closestsegment = i
|
||||||
|
if closestsegment:
|
||||||
|
# Then go to endpoint of closestsegment counterclockwise from point
|
||||||
|
angle1 = misc_funcs.angle_to_point(point, closestsegment.endpoint1)
|
||||||
|
angle2 = misc_funcs.angle_to_point(point, closestsegment.endpoint2)
|
||||||
|
if (angle1<angle2 and angle2-angle1<180):
|
||||||
|
startpoint = closestsegment.endpoint2
|
||||||
|
else:
|
||||||
|
startpoint = closestsegment.endpoint1
|
||||||
|
print startpoint.lines
|
||||||
|
linelist = []
|
||||||
|
for i in startpoint.lines:
|
||||||
|
if i != closestsegment:
|
||||||
|
print closestsegment.angle(i)
|
||||||
|
# nextline = min([[i]])
|
||||||
|
# Then, follow clockwise-most segment leading off from said point
|
||||||
|
# Continue until closestsegment is reached. I _think_ this is inevitable.
|
||||||
|
|
||||||
self.selecting = True
|
self.selecting = True
|
||||||
else:
|
else:
|
||||||
self.onMouseDown(self, x, y, button=button, clicks=clicks)
|
self.onMouseDown(self, x, y, button=button, clicks=clicks)
|
||||||
|
|
@ -2875,6 +2914,9 @@ class Point(object):
|
||||||
super(Point, self).__init__()
|
super(Point, self).__init__()
|
||||||
self.x = x
|
self.x = x
|
||||||
self.y = y
|
self.y = y
|
||||||
|
self.lines = set()
|
||||||
|
def __repr__(self):
|
||||||
|
return "<Point x="+str(self.x)+" y="+str(self.y)+">"
|
||||||
|
|
||||||
|
|
||||||
class Line(object):
|
class Line(object):
|
||||||
|
|
@ -2883,15 +2925,51 @@ class Line(object):
|
||||||
super(Line, self).__init__()
|
super(Line, self).__init__()
|
||||||
self.endpoint1 = endpoint1
|
self.endpoint1 = endpoint1
|
||||||
self.endpoint2 = endpoint2
|
self.endpoint2 = endpoint2
|
||||||
|
self.endpoint1.lines.add(self)
|
||||||
|
self.endpoint2.lines.add(self)
|
||||||
self.connection1 = connection1
|
self.connection1 = connection1
|
||||||
self.connection2 = connection2
|
self.connection2 = connection2
|
||||||
|
if self.connection1: self.connection1.lines.add(self)
|
||||||
|
if self.connection2: self.connection2.lines.add(self)
|
||||||
self.linecolor = LINECOLOR
|
self.linecolor = LINECOLOR
|
||||||
self.linewidth = LINEWIDTH
|
self.linewidth = LINEWIDTH
|
||||||
|
def __repr__(self):
|
||||||
|
return "<Line (endpoint1=("+str(self.endpoint1.x)+","+str(self.endpoint1.y)+"),endpoint2=("+str(self.endpoint2.x)+","+str(self.endpoint2.y)+"))>"
|
||||||
def assign(self, point, which):
|
def assign(self, point, which):
|
||||||
if which==1:
|
if which==1:
|
||||||
self.connection1 = point
|
self.connection1 = point
|
||||||
|
self.connection1.lines.add(self)
|
||||||
elif which==2:
|
elif which==2:
|
||||||
self.connection2 = point
|
self.connection2 = point
|
||||||
|
self.connection2.lines.add(self)
|
||||||
|
def angle(self, other):
|
||||||
|
if self.endpoint1==other.endpoint1:
|
||||||
|
x1 = self.endpoint2.x-self.endpoint1.x
|
||||||
|
y1 = self.endpoint2.y-self.endpoint1.y
|
||||||
|
x2 = other.endpoint2.x-other.endpoint1.x
|
||||||
|
y2 = other.endpoint2.y-other.endpoint1.y
|
||||||
|
elif self.endpoint2==other.endpoint1:
|
||||||
|
x1 = self.endpoint1.x-self.endpoint2.x
|
||||||
|
y1 = self.endpoint1.y-self.endpoint2.y
|
||||||
|
x2 = other.endpoint2.x-other.endpoint1.x
|
||||||
|
y2 = other.endpoint2.y-other.endpoint1.y
|
||||||
|
elif self.endpoint1==other.endpoint2:
|
||||||
|
x1 = self.endpoint2.x-self.endpoint1.x
|
||||||
|
y1 = self.endpoint2.y-self.endpoint1.y
|
||||||
|
x2 = other.endpoint1.x-other.endpoint2.x
|
||||||
|
y2 = other.endpoint1.y-other.endpoint2.y
|
||||||
|
elif self.endpoint2==other.endpoint2:
|
||||||
|
x1 = self.endpoint1.x-self.endpoint2.x
|
||||||
|
y1 = self.endpoint1.y-self.endpoint2.y
|
||||||
|
x2 = other.endpoint1.x-other.endpoint2.x
|
||||||
|
y2 = other.endpoint1.y-other.endpoint2.y
|
||||||
|
dot = x1*x2+y1*y2
|
||||||
|
mag1 = math.sqrt(x1**2+y1**2)
|
||||||
|
mag2 = math.sqrt(x2**2+y2**2)
|
||||||
|
angle = math.acos(dot/(mag1*mag2))/math.pi*180
|
||||||
|
cz = x1*y2-y1*x2
|
||||||
|
if cz>0: angle=360-angle
|
||||||
|
return angle
|
||||||
def draw(self, cr=None, transform=None, rect=None):
|
def draw(self, cr=None, transform=None, rect=None):
|
||||||
if self.connection1:
|
if self.connection1:
|
||||||
self.endpoint1 = self.connection1
|
self.endpoint1 = self.connection1
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue