如何计算三角形(2D)中第三点的坐标,知道2点坐标,所有长度和所有角度

时间:2012-06-15 14:31:55

标签: math geometry coordinates

我有一个三角形,我知道两个顶点的坐标:A =(x1,y1),B =(x2,y2) 所有角度:ABC =90∘,CAB =30∘和BCA =60∘以及所有边长。如何找到第三个顶点的坐标C =(x3,y3)?

我知道有两种解决方案(我想要两种解决方案)。

4 个答案:

答案 0 :(得分:4)

  1. 你知道p1和p2。你知道内部角度。
  2. 从p1通过p2制作光线,并在p1周围以CW或CCW旋转30°。
  3. 通过p1和p2制作一条线,并将其围绕p2旋转90°。
  4. 计算交叉点。
  5. 你得到了积分:

    x3 = x2 + s*(y1 - y2)
    y3 = y2 + s*(x2 - x1)
    

    x3 = x2 + s*(y2 - y1)
    y3 = y2 + s*(x1 - x2)
    

    其中s = 1/sqrt(3) ≈ 0.577350269

答案 1 :(得分:2)

在30-60-90的直角三角形中,最小的腿(与90度角相邻的最小边)的长度为斜边的1/2(与90度角相对的一侧),所以既然你有侧面长度,您可以确定哪条腿是线段AB。

由此可以推断出角度的去向。

然后计算坐标,你需要选择半径圆上的点,正确的半径长度为正确的角度。

两种解决方案来自顺时针或逆时针测量角度,并产生对称三角形,边缘AB为对称线。

由于您已经给出了角度,因此通过二次公式计算AB的长度

L(AB)= Sqrt [(x1-x2)^ 2 +(y1-y2)^ 2]。

现在,让x = L(AC)= 2 * L(BC),因为它是直角三角形,

L(AC)^ 2 = L(BC)^ 2 + L(AB)^ 2,

x ^ 2 =(0.5x)^ 2 + L(AB)^ 2,所以L(AB)= x * Sqrt [3] / 2, 既然你已经计算了L(AB),你现在有了x。

原始AB的角度是a = arctan([y2-y1] / [x2-x1])。 现在你可以向上或向下测量30度(根据需要使用+ 30或-30) 并在角度a +/- 30处标记半径为x的圆(以A为中心)上的点C(我们在上面计算)。

然后,C有坐标

x3 = x1 + x * cos(a + 30)

y3 = y1 + x * sin(a + 30)

或者您可以使用(a-30)来获得对称三角形。

答案 2 :(得分:2)

如果提供两个点和边数作为输入,则返回完整多边形点的代码。 这是为Android(Java)编写的,逻辑可以重复用于其他语言

private static final float angleBetweenPoints(PointF a, PointF b) {
    float deltaY = b.y - a.y;
    float deltaX = b.x - a.x;
    return (float) (Math.atan2(deltaY, deltaX));

}
private static PointF pullPointReferenceToLineWithAngle(PointF a, PointF b,
        float angle) {

    float angleBetween = angleBetweenPoints(b, a);
    float distance = (float) Math.hypot(b.x - a.x, b.y - a.y);
    float x = (float) (b.x + (distance * Math.cos((angleBetween + angle))));
    float y = (float) (b.y + (distance * Math.sin((angleBetween + angle))));
    return new PointF(x, y);
}

private static List<PointF> pullPolygonPointsFromBasePoints(PointF a,
        PointF b, int noOfSides) {
    List<PointF> points = new ArrayList<>();
    points.add(a);
    points.add(b);
    if (noOfSides < 3) {
        return points;
    }
    float angleBetweenTwoSides = (float) ((((noOfSides - 2) * 180) / noOfSides)
            * Math.PI / 180);
    for (int i = 3; i <= noOfSides; i++) {
        PointF nextPoint = pullPointReferenceToLineWithAngle(
                points.get(i - 3), points.get(i - 2), angleBetweenTwoSides);
        points.add(nextPoint);
    }
    return points;
}

用法是onDraw方法:

PointF a = new PointF(100, 600);
    PointF b = new PointF(300, 500);
    int noOfSides = 3;

    List<PointF> polygonPoints = pullPolygonPointsFromBasePoints(a, b,
            noOfSides);

    drawPolyPoints(canvas, noOfSides, polygonPoints);

答案 3 :(得分:0)

这是一个直角三角形。角度ABC为90度,因此计算连接A到B的向量并调用此AA并将其标准化:

 AA = (x2-x1,y2-y1) / |(x2-x1,y2-y1)|

垂直于AA的单位向量由

给出
 BB = (-(y2-y1),x2-x1) / |(x2-x1,y2-y1)|

因为AC与AB垂直,所以您可以获得第一个点P1

 P1 = (x2,y2) + K * BB

其中K是标量值,等于AC的长度(你说你已经在问题中知道了)。然后,通过进入负P2方向

,可以简单地给出第二个解决方案点BB
 P2 = (x2,y2) - K * BB