kopia lustrzana https://github.com/villares/sketch-a-day
52 wiersze
1.7 KiB
Python
52 wiersze
1.7 KiB
Python
"""
|
|
Code From
|
|
https://stackoverflow.com/questions/4001948/drawing-a-triangle-in-a-coordinate-plane-given-its-three-sides
|
|
"""
|
|
|
|
class CirclesSeparate(BaseException):
|
|
pass
|
|
|
|
class CircleContained(BaseException):
|
|
pass
|
|
|
|
def third_point(PVector_a, PVector_b, ac_length, bc_length):
|
|
"""
|
|
Find PVector_c given:
|
|
PVector_a
|
|
PVector_b
|
|
ac_length
|
|
bc_length
|
|
|
|
PVector_d == PVector at which the right-angle to c is formed.
|
|
"""
|
|
ab_length = PVector_a.dist(PVector_b)
|
|
if ab_length > (ac_length + bc_length):
|
|
raise CirclesSeparate("Given sides do not intersect!")
|
|
elif ab_length < abs(ac_length - bc_length):
|
|
raise CircleContained("The circles around the points do not intersect")
|
|
|
|
# get the length to the vertex of the right triangle formed,
|
|
# by the intersection formed by circles a and b
|
|
ad_length = (ab_length**2 + ac_length**2 - bc_length**2)/(2.0 * ab_length)
|
|
|
|
# get the height of the line at a right angle from a_length
|
|
h = sqrt(abs(ac_length**2 - ad_length**2))
|
|
|
|
# Calculate the mid PVector (PVector_d), needed to calculate PVector_c(1|2)
|
|
d_x = PVector_a.x + ad_length * (PVector_b.x - PVector_a.x)/ab_length
|
|
d_y = PVector_a.y + ad_length * (PVector_b.y - PVector_a.y)/ab_length
|
|
PVector_d = PVector(d_x, d_y)
|
|
|
|
# get PVector_c location
|
|
# --> get x
|
|
c_x1 = PVector_d.x + h * (PVector_b.y - PVector_a.y)/ab_length
|
|
c_x2 = PVector_d.x - h * (PVector_b.y - PVector_a.y)/ab_length
|
|
|
|
# --> get y
|
|
c_y1 = PVector_d.y - h * (PVector_b.x - PVector_a.x)/ab_length
|
|
c_y2 = PVector_d.y + h * (PVector_b.x - PVector_a.x)/ab_length
|
|
|
|
PVector_c1 = PVector(c_x1, c_y1)
|
|
PVector_c2 = PVector(c_x2, c_y2)
|
|
return PVector_c1, PVector_c2
|