我有一个三角形,我知道两个顶点的坐标:A =(x1,y1),B =( x2,y2) 所有角度:ABC =90∘,CAB =30∘和BCA =60∘以及所有边缘长度。我怎样才能找到第三个顶点C =(x3,y3)的坐标?如何计算三角形(2D)中第三点的坐标知道2点坐标,所有长度和所有角度
我知道有两个解决方案(我想都)。
我有一个三角形,我知道两个顶点的坐标:A =(x1,y1),B =( x2,y2) 所有角度:ABC =90∘,CAB =30∘和BCA =60∘以及所有边缘长度。我怎样才能找到第三个顶点C =(x3,y3)的坐标?如何计算三角形(2D)中第三点的坐标知道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)来得到对称的三角形。
这是一个直角三角形。角度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
你获得积分:
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
这里是回到充满多边形的点,如果两个点和侧面的数量均码作为输入提供。 这是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);
你知道有两种解决办法,但你不要知道他们是什么? – jrturton
只画一个图。很明显,有两种解决方案。 C可以高于或低于A和B之间的线。 – QuantumMechanic
锡尼斯法应该工作。 http://en.wikipedia.org/wiki/Law_of_sines – javajavajava