2012-06-15 415 views
0

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

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

+0

你知道有两种解决办法,但你不要知道他们是什么? – jrturton

+0

只画一个图。很明显,有两种解决方案。 C可以高于或低于A和B之间的线。 – QuantumMechanic

+0

锡尼斯法应该工作。 http://en.wikipedia.org/wiki/Law_of_sines – javajavajava

回答

2

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

从这里你可以推断角度在哪里。

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

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

由于您已经给出的角度,通过二次公式

L(AB)计算AB的长度= SQRT [(X1-X2)^ 2 +(Y1-Y2)^ 2]。

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

L(AC)^ 2 = L(BC)^ 2 + L(AB)因为L(AB)= x * Sqrt [3]/2, 并且由于您已经计算出L(AB),因此L(AB)= 2 *你现在有x。

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

然后,C具有坐标

X3 = X1 + X * cos(A + 30)

Y3 = Y1 + X * SIN(A + 30)

或你可以使用(a-30)来得到对称的三角形。

+0

如果必须绘制,我知道点的位置,但我想知道x3 = ...和y3 = ...的公式以确定点的确切坐标。我需要这个程序(代码)不仅仅是1个问题 –

+0

我误解了这个问题,对不起。已经做了必要的修改。 – gt6989b

+0

只是做了一些编辑修改错别字和格式。 – gt6989b

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 
3
  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

0

这里是回到充满多边形的点,如果两个点和侧面的数量均码作为输入提供。 这是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); 
相关问题