2010-10-23 11 views

Répondre

10

J'ai lu la réponse de brainjam et vérifié si sa réponse est vraie et il a raison. Calculs: O (0; 0), A (a; 0) et B (x; y) sont les trois points du triangle. C1 est le cercle autour de A et r1 = c; C2 est le cercle autour de O et r2 = b. B (X; Y) est l'intersection de C1 et C2, ce qui signifie que le point est sur les deux cercles.

alt text

C1: (x - a) * (x - a) + y * y = c * c

C2: x * x + y * y = b * b

y * y = b * b - x * x

(x - a) * (x - a) + b * b - x * x = c * c

x * x - 2 * a * x + a * b * a + b - x * x - c * c = 0

2 * a * x = (a * + b * b - c * c)

x = (a * + b * b - c * c)/(2 * a)

y * y = b * b - ((a * + b * b - c * c)/(2 * a)) * ((a * + b * b - c * c)/(2 * a))

y = + - sqrt (b * b - ((a * + b * b - c * c)/(2 * a)) * ((a * + b * b - c * c)/(2 * a)))

+2

+1 pour poster des maths. –

8

Placez le premier sommet à l'origine (0,0). Placez le deuxième sommet à (a, 0). Pour calculer le troisième sommet, trouvez le intersection des deux cercles avec les centres (0,0) et (a, 0) et les rayons b et c.

Mise à jour: Lajos Arpad a donné les détails du calcul de l'emplacement du troisième point dans this answer. Elle se résume à (x, y) où x = (b + un 2 -c)/2a et y = & plusmn; sqrt (b -x)

+2

Très bonne solution, je vais vous Upvote, mais je trouve cette réponse incomplète, parce que vous n'avez pas écrit les détails vers le bas. Je pris une feuille de papier et un stylo et calculé ce que vous avez dit, vous faire part du résultat ferait avec toute personne intéressée par le sujet. –

+0

@Lajos, je ne sais pas ce qui doit être prouvée. Les résultats de la construction sur les côtés d'une longueur, b, c ... Je dirais que cela est évident, pourquoi voudriez-vous dire que ce n'est pas évident? Parce que – brainjam

+0

a posé une question à ce sujet était. Je ne savais pas cette solution et je devais vérifier. Je suis un agnostique, croyant que ce que je vois. Vous étiez tout à fait raison avec votre message Flickr, je voulais juste rō davantage. En outre, la solution est une solution, vous pouvez mettre le triangle vì où vous voulez en utilisant des techniques de rotation et de translation. –

3

Lorsque vous dessinez un triangle inconnu, il est généralement plus facile de sélectionner un côté (disons le plus long) et de le placer horizontalement ou verticalement. Les extrémités de ce côté forment deux sommets du triangle, et vous pouvez calculer le troisième en subdivisant le triangle en deux triangles rectangles (les deux autres côtés sont les hypoténuses) et en utilisant les fonctions sinus/cosinus inverses pour déterminer les angles manquants . En subdivisant en triangles rectangles, je veux dire quelque chose qui ressemble à l'image ici: http://en.wikipedia.org/wiki/File:Triangle.TrigArea.svg Votre premier côté serait AC dans ce dessin.

Une fois que vous avez trouvé le triangle, il devrait être facile de calculer son centre et de le traduire afin qu'il soit centré sur n'importe quel point central arbitraire que vous aimez.

2

Vérifiez d'abord que le triangle est possible:

 
    a+b >= c 
    b+c >= a 
    c+a >= b
Ensuite, si c'est le cas, résolvez l'intersection des deux cercles. Les sommets de base sont
 
    {0,0}, {a,0}, {x,y}
 
    x = (a^2-b^2+c^2)/(2a) 
    y = sqrt(c^2-x^2)
Trouver le circumcenter est assez facile à partir de ce point.

+0

'x' et' y'? La formule est incorrecte –

+0

(essayer pour a, b, c = 4,3,5 par exemple). La bonne formule est dérivée dans la réponse par Lajos. – brainjam

+0

@brainjam: x = (4^2-3^2^2 + 5)/(8) == 4 == == 32/8 a, comme on s'y attendait. y = sqrt (5^16/02) = 3 == b, comme prévu. Il est une version habillée de la loi du cosinus et le théorème de Pythagore Athènes.Il arrive aussi à être la solution * seulement * à l'intersection des deux cercles qui * vérifie * également * l'inégalité triangulaire pour les longueurs latérales (les trois tests de possibilité que j'ai donnés). –

5

enter image description here

Cette question et les réponses helpe d me aujourd'hui mise en œuvre de ce sujet. Il calcule les sommets inconnus, « c » des intersections de cercle donné deux points connus (a, b) et les distances (ac_length, bc_length) au 3e sommet inconnu, « c ». Voici mon une implémentation pour python quả intéressé à personne.

Je suis également référencé sur la baisse:

http://mathworld.wolfram.com/RadicalLine.html

http://mathworld.wolfram.com/Circle-CircleIntersection.html

En utilisant le module GEOS de django pour l'objet Point(), pourrait être la mà avec des objets bien faits, non alignés tout à fait ou pointer vraiment.

from math import sqrt 
from django.contrib.gis.geos import Point 

class CirclesSeparate(BaseException): 
    pass 

class CircleContained(BaseException): 
    pass 

def discover_location(point_a, point_b, ac_length, bc_length): 
    """ 
    Find point_c given: 
     point_a 
     point_b 
     ac_length 
     bc_length 

    point_d == point at which the right-angle to c is formed. 
    """ 
    ab_length = point_a.distance(point_b)  
    if ab_length > (ac_length + bc_length): 
     raise CirclesSeparate("Given points do not intersect!")  
    elif ab_length < abs(ac_length - bc_length): 
     raise CircleContained("The circle of 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 point (point_d), needed to calculate point_c(1|2) 
    d_x = point_a.x + ad_length * (point_b.x - point_a.x)/ab_length 
    d_y = point_a.y + ad_length * (point_b.y - point_a.y)/ab_length 
    point_d = Point(d_x, d_y)  

    # get point_c location 
    # --> get x 
    c_x1 = point_d.x + h * (point_b.y - point_a.y)/ab_length 
    c_x2 = point_d.x - h * (point_b.y - point_a.y)/ab_length 

    # --> get y 
    c_y1 = point_d.y - h * (point_b.x - point_a.x)/ab_length 
    c_y2 = point_d.y + h * (point_b.x - point_a.x)/ab_length  

    point_c1 = Point(c_x1, c_y1) 
    point_c2 = Point(c_x2, c_y2)  
    return point_c1, point_c2 
Questions connexes