在给定三个边的坐标平面中绘制三角形

Posted

技术标签:

【中文标题】在给定三个边的坐标平面中绘制三角形【英文标题】:Drawing a triangle in a coordinate plane given its three sides 【发布时间】:2011-04-29 10:52:23 【问题描述】:

三角形三个边的长度,a,b,c 会给出,我需要找到顶点的坐标。中心(可能是外心)可以是原点或 (x,y)。

谁能指出我正确的方向?

【问题讨论】:

【参考方案1】:

这个问题和答案帮助我今天实现了这一点。它将在给定 2 个已知点 (a, b) 和到第三个未知顶点“c”的距离 (ac_length, bc_length) 的情况下计算圆形交点的未知顶点“c”。 这是我为任何感兴趣的人生成的 Python 实现。

我还引用了以下内容:

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

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

Point() 对象使用django 的geos 模块,可以将其替换为shapely,或者完全删除点对象。

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 

【讨论】:

【参考方案2】:

将第一个顶点放在原点 (0,0)。将第二个顶点放置在 (a,0) 处。要计算第三个顶点,请找到中心为 (0,0) 和 (a,0) 且半径为 b 和 c 的两个圆的intersection。

更新: Lajos Arpad 给出了计算this answer 中第三个点位置的详细信息。它归结为 (x,y) 其中 x = (b2+a2-c2)/2a 和 y=±sqrt (b2-x2)

【讨论】:

非常好的解决方案,我会支持你,但我发现这个答案不完整,因为你没有写下细节。我拿了一张纸和一支笔,计算了你所说的内容,想与任何对该主题感兴趣的人分享结果。 @Lajos,我不确定需要证明什么。构造结果的边长为 a,b,c ...我会说这很明显,为什么你会说这不明显? 因为有人问过这个问题。我不知道这个解决方案,我不得不检查。我是一个不可知论者,只相信我看到的。您的帖子绝对正确,我只是想进一步说明。此外,解决方案就是解决方案,因为您可以使用旋转和平移技术将三角形放在您想要的任何位置。 @Lajos,我并不是说结构很明显,我的意思是一旦你有了它,三个边的长度就很明显了。不管怎样,把第三个顶点的细节拼出来对你很有帮助,我已经链接到了。 “我的意思是一旦你有了它,三边的长度就很明显了。”抱歉,一开始我误会了。你是对的。【参考方案3】:

我已经阅读了 Brainjam 的答案,并检查了他的答案是否正确以及他是否正确。 计算: O(0;0)、A(a;0) 和 B(x;y) 是三角形的三个点。 C1 是 A 周围的圆,r1 = c; C2 是围绕 O 和 r2 = b 的圆。 B(X;Y)是C1和C2的交点,表示点在两个圆上。

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 * a))

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

【讨论】:

【参考方案4】:

首先检查三角形是否可能:

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)
从这一点来看,找到外心非常容易。

【讨论】:

你从哪里得到xy 的公式? 公式不正确(例如,尝试 a,b,c = 4,3,5)。正确的公式来自 Lajos 的答案。 @brainjam: x = (4^2 - 3^2 + 5^2)/(8) == 32/8 == 4 == a,正如预期的那样。正如预期的那样,y = sqrt(5^2-16) = 3 == b。这是余弦定律和勾股定理的修饰版本。它也恰好是满足边长的三角形不等式的两个圆的交点的唯一解(我给出的三个可能性测试)。跨度> @Kshitij Parajul:我让 Mathematica 求解交点,假设三角形不等式和 a、b、c、x 和 y 的正性。然而,我认识到它们是经过调整的余弦定律和毕达哥拉斯定理,因此了解它们将如何推导出来并且它们是正确的。 你是绝对正确的。我将半径 b(而不是 c)与中心 (0,0) 相关联,因此期待答案 (0,3) 而不是 (4,3)。【参考方案5】:

绘制未知三角形时,通常最容易选择一侧(例如最长的一侧)并将其水平或垂直放置。该边的端点构成了三角形的两个顶点,您可以通过将三角形细分为两个直角三角形(另外两个边是斜边)并使用反正弦/余弦函数计算出缺失的角度来计算第三个顶点.通过细分为直角三角形,我的意思是看起来像这里的图像:http://en.wikipedia.org/wiki/File:Triangle.TrigArea.svg 您的第一面将是该图中的 AC。

一旦确定了三角形,就应该很容易计算它的中心并对其进行平移,以便它以您喜欢的任意中心点为中心。

【讨论】:

以上是关于在给定三个边的坐标平面中绘制三角形的主要内容,如果未能解决你的问题,请参考以下文章

习题3-5 三角形判断 (15分)

习题3-5 三角形判断 (15分)

编程:判断一个点是否在三角形内部

[HNOI 2012]三角形覆盖问题

几何画板中标记三角形的边的方法

DirectX学习笔记:利用平面着色和Gouraud着色模式绘制具有颜色的三角形