如何通过给定的 2 个点计算弧的 'start' 和 'end' 角度?
How to calculate 'start' & 'end' angle of an Arc by given 2 points?
我一直在尝试使用 p5.js 在 canvas 上绘制一个 arc
。我得到了起点和终点,我使用 pythagoras
使用两个点计算的弦长,还给出了高度和宽度值。
为了绘制弧线,我需要使用以下函数;
arc(x, y, w, h, start, stop, [mode], [detail])
文档参考 here
start
& stop
参数是指以弧度指定的开始和结束角度。如果没有这些角度,我无法绘制弧线,也无法使用我得到的东西来计算它们。
我搜索了很多类似我问题的例子,但是建议计算中心角,我也做不到。即使我能够计算出中心角,我之后应该如何获得开始和停止角度?
我在GeoGebra上画了一些示例图;
向量的角度可以通过atan2()
计算。
请注意:
tan(alpha) = sin(alpha) / cos(alpha)
如果你有一个向量(x
,y
),那么向量相对于x轴的角度(alpha
)是:
alpha = atan2(y, x);
圆弧的start_angle
和stop_angle
,其中圆弧的圆心为(cpt_x
,cpt_y
),起点为(spt_x
, spt_y
) 终点为(ept_x
, ept_y
), 可以计算为:
start_angle = atan2(spt_y-cpt_y, spt_x-cpt_x);
stop_angle = atan2(ept_y-cpt_y, ept_x-cpt_x);
参见示例,停止角度取决于鼠标位置:
var sketch = function( p ) {
p.setup = function() {
let sketchCanvas = p.createCanvas(p.windowWidth, p.windowHeight);
sketchCanvas.parent('p5js_canvas')
}
p.windowResized = function() {
p.resizeCanvas(p.windowWidth, p.windowHeight);
}
p.draw = function() {
let cpt = new p5.Vector(p.width/2, p.height/2);
let rad = p.min(p.width/2, p.height/2) * 0.9;
let stop_angle = p.atan2(p.mouseY-cpt.y, p.mouseX-cpt.x);
p.background(192);
p.stroke(255, 64, 64);
p.strokeWeight(3);
p.noFill();
p.arc(cpt.x, cpt.y, rad*2, rad*2, 0, stop_angle);
}
};
var circle = new p5(sketch);
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.9.0/p5.js"></script>
<div id="p5js_canvas"></div>
我一直在尝试使用 p5.js 在 canvas 上绘制一个 arc
。我得到了起点和终点,我使用 pythagoras
使用两个点计算的弦长,还给出了高度和宽度值。
为了绘制弧线,我需要使用以下函数;
arc(x, y, w, h, start, stop, [mode], [detail])
文档参考 here
start
& stop
参数是指以弧度指定的开始和结束角度。如果没有这些角度,我无法绘制弧线,也无法使用我得到的东西来计算它们。
我搜索了很多类似我问题的例子,但是建议计算中心角,我也做不到。即使我能够计算出中心角,我之后应该如何获得开始和停止角度?
我在GeoGebra上画了一些示例图;
向量的角度可以通过atan2()
计算。
请注意:
tan(alpha) = sin(alpha) / cos(alpha)
如果你有一个向量(x
,y
),那么向量相对于x轴的角度(alpha
)是:
alpha = atan2(y, x);
圆弧的start_angle
和stop_angle
,其中圆弧的圆心为(cpt_x
,cpt_y
),起点为(spt_x
, spt_y
) 终点为(ept_x
, ept_y
), 可以计算为:
start_angle = atan2(spt_y-cpt_y, spt_x-cpt_x);
stop_angle = atan2(ept_y-cpt_y, ept_x-cpt_x);
参见示例,停止角度取决于鼠标位置:
var sketch = function( p ) {
p.setup = function() {
let sketchCanvas = p.createCanvas(p.windowWidth, p.windowHeight);
sketchCanvas.parent('p5js_canvas')
}
p.windowResized = function() {
p.resizeCanvas(p.windowWidth, p.windowHeight);
}
p.draw = function() {
let cpt = new p5.Vector(p.width/2, p.height/2);
let rad = p.min(p.width/2, p.height/2) * 0.9;
let stop_angle = p.atan2(p.mouseY-cpt.y, p.mouseX-cpt.x);
p.background(192);
p.stroke(255, 64, 64);
p.strokeWeight(3);
p.noFill();
p.arc(cpt.x, cpt.y, rad*2, rad*2, 0, stop_angle);
}
};
var circle = new p5(sketch);
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.9.0/p5.js"></script>
<div id="p5js_canvas"></div>