【问题标题】:How to calculate 'start' & 'end' angle of an Arc by given 2 points?如何通过给定的 2 个点计算 Arc 的“开始”和“结束”角度?
【发布时间】:2020-01-06 05:12:58
【问题描述】:

我一直在尝试使用 p5.js 在画布上绘制 arc。我得到了起点和终点,我使用pythagoras 使用这两个点计算的弦长,还给出了高度和宽度值。

为了画弧线,我需要使用以下函数; arc(x, y, w, h, start, stop, [mode], [detail]) 文档参考here

start & stop 参数是指以弧度指定的开始和停止角度。没有这些角度,我无法绘制弧线,也无法使用我得到的东西来计算它们。

我搜索了很多类似于我的问题的示例,但建议计算中心角,我也无法这样做。即使我能够计算中心角,我应该如何获得之后的开始和停止角?

我在 GeoGebra 上绘制了一些示例插图;

【问题讨论】:

    标签: javascript math processing trigonometry p5.js


    【解决方案1】:

    一个向量的角度可以通过atan2()来计算。

    请注意:

    tan(alpha) = sin(alpha) / cos(alpha)
    

    如果你有一个向量(xy),那么向量相对于 x 轴的角度(alpha)是:

    alpha = atan2(y, x);
    

    圆弧的start_anglestop_angle,圆弧的中心是(cpt_xcpt_y),起点是(spt_xspt_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>

    【讨论】:

    • 嗯,详细的解释给我留下了深刻的印象!奇迹般有效。我想我需要学习一些 cs 图形的几何学,对一本书或教程集有什么建议吗?
    • @AhmetGokdayi 谢谢。不客气。对不起,但我不知道一个好的教程。谷歌找到了THISTHIS,看起来很有希望。 p5.Vector 在 p5.js 中实现向量运算。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多