0

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

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

4

4 回答 4

5
  1. 你知道 p1 和 p2。你知道内角。
  2. 从 p1 到 p2 发出一条射线,并围绕 p1 顺时针或逆时针旋转 30°。
  3. 通过 p1 和 p2 画一条线,并围绕 p2 旋转 90°。
  4. 计算交叉点。

你得到积分:

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

于 2012-06-15T15:14:48.797 回答
2

在 30-60-90 直角三角形中,最小的腿(与 90 度角相邻的最小边)的长度是斜边(与 90 度角相对的边)的 1/2,所以既然你有边长,你可以确定哪条腿是线段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 度(根据需要使用 a+30 或 a-30)并以角度 a +/- 标记半径 x(我们在上面计算)的圆(以 A 为中心)上的点 C 30.

那么,C有坐标

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

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

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

于 2012-06-15T14:40:05.483 回答
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);
于 2015-10-14T03:12:31.840 回答
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
于 2012-06-15T14:40:21.927 回答