英文:
How to calculate X and Y coordinates given an angle and varying side lengths
问题
我正在开发一个使用Google Maps JavaScript API的应用程序,允许用户绘制多个折线路径,计算角度,然后尝试弯曲这些角度,模拟车辆的转弯半径。为了做到这一点,我需要知道弯曲的起始点和终点。问题在于这些角度可以在地图上的任何方向,我在寻找适当的方法来计算这些点的(X,Y)坐标方面遇到了困难...我可以计算大小,但由于不同的方向,不确定如何将其转换为一组笛卡尔坐标。以下是几何结构的概述:
最终,我有点A、B和C,角度a以及圆的半径。在这种情况下,如何计算点P1、P2和(未标记的)贝塞尔曲线的绿色参考点的笛卡尔坐标?这些点不需要具体,只需大致指导曲线。
英文:
I am building a Google Maps Javascript API application that allows the user to draw a path of multiple polylines, calculates the angles, then attempts to curve the angles, simulating a vehicle turning radius. In order to do this, I need the point the curve starts and stops at. The problem is that these angles can be in any assortment of directions on a map, and I am struggling to find the appropriate way to calculate the (X,Y) coordinates of these points... I can calculate the magnitude, but due to the varying orientation, am not sure how to get it back to a set of cartesian coordinates. Here is an outline of the geometry:
Ultimately, I have points A, B, and C, angle a, and the radius of the circle. Given that, how can I calculate points P1, P2, and (not labeled) the green reference points for the bezier curve in terms of cartesian coordinates? These points do not have to be specific, just in the general area to guide the curve.
答案1
得分: 0
Vectors BA
and BC
are defined as follows:
BA.x = A.x - B.x
BA.y = A.y - B.y, etc.
Unit vectors are calculated as:
len(BA) = sqrt(BA.x * BA.x + BA.y * BA.y)
uBA = BA / len(BA) (uBA.x = BA.x / len(BA), etc)
uBC = BC / len(BC)
The cosine of the angle between vectors is obtained as:
cs = cos(fullangle) = dot(uBA, uBC) = uBA.x * uBC.x + uBA.y * uBC.y
The tangent of half-angle is determined by:
tn = sqrt((1 - cs) / (1 + cs))
To calculate points that provide a normal distance R
from the bisector to lines, use these formulas:
P1 = B + uBA * R / tn (P1.x = B.x + uBA.x * R / tn, etc.)
P2 = B + uBC * R / tn
For smooth conjugation of a Bezier curve and lines, the control points on lines are defined as:
C1 = P1 - uBA * R * coeff
C2 = P2 - uBC * R * coeff
Where the coefficient should be adjusted for a "smart curve" look, typically in the range 0.3 to 1. A common value is:
coeff = 0.552
This value for right-angled lines results in an almost perfect circle arc. In general, the coefficient can be approximated as:
coeff = 4/3 * tg(angle/4)
Please note that the code and formulas provided here are not translated, as requested.
英文:
Make vectors BA
and BС
BA.x = A.x-B.x
BA.y = A.y-B.y etc
Make unit vectors
len(BA) = sqrt(BA.x*BA.x+BA.y*BA.y)
uBA = BA / len(BA) (uBA.x = BA.x/len(BA) etc)
uBC = BC / len(BC)
Get cosine of angle between vectors
cs = cos(fullangle) = dot(uBA, uBC) = uBA.x*uBC.x + uBA.y*ubC.y
Get tangent of half-angle
tn = sqrt((1-cs)/(1+cs))
Calculate points to provide normal distance R
from bisector to lines
P1 = B + uBA * R / tn (P1.x = B.x + uBA.x * R / tn etc)
P2 = B + uBC * R / tn
Note that smooth conjugation of Bezier curve and lines requires control points on lines, so
C1 = P1 - uBA * R * coeff
C2 = P2 - uBC * R * coeff
Where coefficient should be adapted for "smart curve" look, perhaps in range 0.3..1.
coeff=0.552
for right-angled lines gives almost perfect circle arc.
In general
coeff = 4/3*tg(angle/4)
is nice approximantion
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论