Changeset - 28ca21b89e43
[Not reviewed]
default
0 1 0
Laman - 6 years ago 2019-01-01 11:24:48

fix: returned returns to corners
1 file changed with 8 insertions and 3 deletions:
0 comments (0 inline, 0 general)
src/analyzer/corners.py
Show inline comments
 
@@ -46,55 +46,60 @@ class Corners:
 
	#  A BCD        |  +  |  +  |  +  |  +  |    15 | 0
 
	#  A BDC        |  +  |  +  |  -  |  -  |    12 | CD
 
	#  A CBD        |  -  |  +  |  +  |  -  |     6 | BC
 
	#  A CDB        |  -  |  -  |  +  |  +  |     3 | AB
 
	#  A DBC        |  +  |  -  |  -  |  +  |     9 | AD
 
	#  A DCB        |  -  |  -  |  -  |  -  |     0 | BD
 
	#
 
	#  For every non-degenerate quadrangle, there must be 1-3 edges going right-left (from a higher to a lower x coordinate).
 
	#  From these pick the one with the lowest slope (dy/dx) and declare its ending point the upper left corner. For the same slope pick the one further left.
 
	#
 
	#  @return True for a convex quadrangle, False for concave and degenerate cases.
 
	def _canonizeOrder(self):
 
		if len(self._corners)!=4: self._is_canon=False
 
		def false():
 
			self._is_canon=False
 
			return False
 

	
 
		if len(self._corners)!=4: return false()
 

	
 
		a,b,c,d=self._corners
 
		abc=doubleTriangleArea(a,b,c)
 
		abd=doubleTriangleArea(a,b,d)
 
		acd=doubleTriangleArea(a,c,d)
 
		bcd=doubleTriangleArea(b,c,d)
 

	
 
		if any(x==0 for x in (abc,abd,acd,bcd)): self._is_canon=False # collinear degenerate
 
		if any(x==0 for x in (abc,abd,acd,bcd)): return false() # collinear degenerate
 

	
 
		swaps=[(1,3),(0,1),(1,2),(0,3),(2,3),(0,0)]
 
		index=(8 if abc>0 else 0)|(4 if abd>0 else 0)|(2 if acd>0 else 0)|(1 if bcd>0 else 0)
 
		if index%3!=0: return False # concave degenerate
 
		if index%3!=0: return false() # concave degenerate
 
		swap=swaps[index//3]
 

	
 
		self._corners[swap[0]], self._corners[swap[1]] = self._corners[swap[1]], self._corners[swap[0]] # counter-clockwise order
 

	
 
		kIndex=None
 
		lowestSlope=float("inf")
 

	
 
		for i,corner in enumerate(self._corners): # find the NK edge: going right-left with the lowest slope, secondarily the one going down
 
			ii=(i+1)%4
 
			slope=abs(getSlope(corner, self._corners[ii]))
 
			if corner.x>self._corners[ii].x and (slope < lowestSlope or (slope == lowestSlope and corner.y < self._corners[ii].y)):
 
				kIndex=ii
 
				lowestSlope=slope
 

	
 
		self._corners= self._corners[kIndex:] + self._corners[:kIndex] # rotate the upper left corner to the first place
 

	
 
		log.debug(self._corners)
 
		self._is_canon=True # success
 
		return True
 

	
 
	def scale(self,scale):
 
		self._corners=[c * scale for c in self._corners]
 

	
 
	def __iter__(self):
 
		return iter(self._corners)
 

	
 
	def __len__(self):
 
		return len(self._corners)
 

	
 
	def is_canon(self):
 
		return self._is_canon
0 comments (0 inline, 0 general)