Рисование треугольника в координатной плоскости с учетом его трех сторон - PullRequest
5 голосов
/ 23 октября 2010

Будет дана длина трех сторон треугольника a, b и c, и мне нужно найти координаты вершин. Центр (возможно, центр окружности) может быть источником или (x, y).

Кто-нибудь может указать мне правильное направление?

Ответы [ 5 ]

11 голосов
/ 23 октября 2010

Я прочитал ответ Brainjam и проверил, верен ли его ответ, и прав ли он. Расчет: O (0; 0), A (a; 0) и B (x; y) - три точки треугольника. C1 - круг вокруг A и r1 = c; C2 - круг вокруг O и r2 = b. B (X; Y) - это пересечение C1 и C2, что означает, что точка находится на обеих окружностях.

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 * a + b * b - x * x - c * c = 0

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

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

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

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

8 голосов
/ 23 октября 2010

Поместите первую вершину в начало координат (0,0). Поместите вторую вершину в (a, 0). Чтобы вычислить третью вершину, найдите пересечение двух окружностей с центрами (0,0) и (a, 0) и радиусами b и c.

Обновление: Лайос Арпад предоставил детали вычисления местоположения третьей точки в этом ответе . Это сводится к (x, y), где x = (b 2 + a 2 -c 2 ) / 2a и y = & plusmn; sqrt (b 2 -x 2 )

5 голосов
/ 06 июля 2012

enter image description here

Этот вопрос и ответы помогли мне сегодня в реализации этого. Он вычислит неизвестные вершины, "c" пересечений окружности, учитывая 2 известные точки (a, b) и расстояния (ac_length, bc_length) до 3-й неизвестной вершины, "c". Вот моя итоговая реализация на python для всех, кто интересуется.

Я также ссылался на следующее:

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

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

Использование модуля geos от django для объекта Point(), который может быть заменен на фигурный, или точечные объекты вообще удалены.

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 
3 голосов
/ 23 октября 2010

При рисовании неизвестного треугольника обычно легче выбрать одну сторону (скажем, самую длинную) и расположить ее горизонтально или вертикально. Конечные точки этой стороны составляют две вершины треугольника, и вы можете вычислить третью, поделив треугольник на два прямоугольных треугольника (две другие стороны - гипотенусы) и используя обратные функции синуса / косинуса, чтобы выяснить недостающие углы. , Подразделяя на прямоугольные треугольники, я имею в виду нечто, похожее на изображение здесь: http://en.wikipedia.org/wiki/File:Triangle.TrigArea.svg Ваша первая сторона будет AC на этом чертеже.

После того, как вы вычислили треугольник, должно быть легко вычислить его центр и перевести его так, чтобы он центрировался в любой произвольной центральной точке, которая вам нравится.

2 голосов
/ 23 октября 2010

Сначала проверьте, что треугольник возможен:

    a+b >= c
    b+c >= a
    c+a >= b
Затем, если это так, решите для пересечения двух кругов. Основные вершины
    {0,0}, {a,0}, {x,y}
где
    x = (a^2-b^2+c^2)/(2a)
    y = sqrt(c^2-x^2)
С этой точки довольно легко найти круговой центр.
...