如何使用javascript使用两个坐标绘制椭圆?
就像图中的blow一样,我有两个坐标,我想画一个长轴边缘与这两点匹配的椭圆 我试着得到这两个坐标之间的中点,然后在这一个坐标的基础上画一个椭圆。下面的代码函数返回椭圆点数组,这正是我想要的:如何使用javascript使用两个坐标绘制椭圆?,javascript,algorithm,graphics,2d,ellipse,Javascript,Algorithm,Graphics,2d,Ellipse,就像图中的blow一样,我有两个坐标,我想画一个长轴边缘与这两点匹配的椭圆 我试着得到这两个坐标之间的中点,然后在这一个坐标的基础上画一个椭圆。下面的代码函数返回椭圆点数组,这正是我想要的: function add_oval(centre, x, y) { var assemble = new Array(); var angle; var dot; var tangent = x / y; for (i = 0; i < 36; i++) {
function add_oval(centre, x, y) {
var assemble = new Array();
var angle;
var dot;
var tangent = x / y;
for (i = 0; i < 36; i++) {
angle = (2 * Math.PI / 36) * i;
dot = [centre.lng + Math.sin(angle) * y * tangent, centre.lat + Math.cos(angle) * y];
assemble.push(dot);
}
return assemble;
}
功能添加_椭圆(中心,x,y){
var assemble=新数组();
var角;
var点;
var切线=x/y;
对于(i=0;i<36;i++){
角度=(2*Math.PI/36)*i;
点=[center.lng+Math.sin(角度)*y*切线,center.lat+Math.cos(角度)*y];
组装。推(点);
}
返回装配;
}
但问题是,这些只能画一个水平椭圆,我不知道如何改变角度
有人知道如何解决我的问题吗?提示:
如果javascript中没有旋转椭圆特性,一个解决方法是使用贝塞尔立方近似。关于如何用四个贝塞尔圆弧近似圆,请参阅文章。然后一个椭圆就是一个拉伸的圆,它足以以同样的方式拉伸控制点
从单位圆开始,按轴长度缩放控制点,应用所需旋转并平移到所需中心。可以从给定的长轴(加上短轴的长度)绘制缩放和旋转参数
另一种方法是使用椭圆的参数方程并将其绘制为多段线。我将使用基向量
A,B
2D点。您还需要定义标量短半轴大小|b |
来定义椭圆。因此,我们知道:
A=!
B=!
|b|=!
A,B
C.x=A.x + (B.x-A.x)/2
C.y=A.y + (B.y-A.y)/2
C.x = (A.x+B.x)/2
C.y = (A.y+B.y)/2
或A、B的平均值
C.x=A.x + (B.x-A.x)/2
C.y=A.y + (B.y-A.y)/2
C.x = (A.x+B.x)/2
C.y = (A.y+B.y)/2
选择你更喜欢哪一个(哪一个无关紧要)。该点C
将用作基向量原点
a,b
长半轴很简单,因为它由CB
或CA
定义(对于全椭圆,哪一个也不重要)
您也可以使用一半的AB
a.x = (B.x-A.x)/2
a.y = (B.y-A.y)/2
短半轴b
更糟糕,我们知道它垂直于a
,因此在3D ad重缩放中利用a
与向量(0,0,1)
的叉积,或者利用这样一个事实,如果将(x,y)
交换到(y,-x)
或(-y,x)
在2D中获得90度旋转。并从大小|a |
重新缩放到大小|b |
,以便:
|a| = sqrt( a.x*a.x + a.y*a.y )
b.x = a.y * |b|/|a|
b.y =-a.x * |b|/|a|
ang=
参数化,其中M_PI=3.1415926535897932384626433832795
很容易:
x = C.x + a.x*cos(ang) + b.x*sin(ang)
y = C.y + a.y*cos(ang) + b.y*sin(ang)
因此,要么将其添加到for循环中,然后像现在一样使用点渲染椭圆。或将椭圆渲染为带直线的多段线。。。例如,VCL/GDI中的类似内容(很抱歉,我不使用javascript):
- 二维中的点和向量定义为两个坐标的集合
(x,y)
- 标量是单个值(标准编号)
表示向量的大小| a |
a
- 上述计算不需要
|a |>|b |
- 如果
未知,可以使用|b |
的缩放比例,例如让|a |
|b |/| a |=0.3
(x,y)
添加到点列表中。您还需要更改dang
步骤,以便获得足够的分数。计算精确的相邻像素位置对于旋转来说是一个非常困难的问题,因为它会导致超越问题。。。使用更小的dang
步长和重复像素的风险更容易、更快。为了更好地估计,您可以使用圆近似。。。所以如果我没有弄错的话