RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1380288
Accepted
solarisedigle
solarisedigle
Asked:2022-07-09 22:07:15 +0000 UTC2022-07-09 22:07:15 +0000 UTC 2022-07-09 22:07:15 +0000 UTC

极坐标中正方形的虚线轮廓有凸起

  • 772

我有一个函数可以根据它的长度和角度画一条线(这不能改变,最终结果取决于它)

这是问题所在:

在此处输入图像描述

我有距离a(0°线)和距离b。使用毕达哥拉斯公式,我得到了虚线的长度。我也知道标记的角度。

最后一点必须在虚线的末端。

在此处输入图像描述

问题是该点逐渐升高然后降低。

如果您将半径设置得更多 - 只有更低

可能是什么问题以及如何解决?

let canv = document.getElementById('canv');
let ctx = canv.getContext('2d');
ctx.fillRect(0, 0, 300, 300);
let parts = 120;
let line_width = 300;
let part_width = line_width/(parts + 1);
let part_angle = (Math.PI/2)/parts;
let start_radius = 150;

// для ориентировки на холсте
ctx.strokeStyle = "white";
ctx.beginPath();
ctx.moveTo(0, 100);  
ctx.lineTo(300, 100);
ctx.moveTo(0, 150);  
ctx.lineTo(300, 150);
ctx.moveTo(0, 200);  
ctx.lineTo(300, 200);
ctx.moveTo(0, 250);  
ctx.lineTo(300, 250);
ctx.stroke();

ctx.strokeStyle = "red";
for(let i = 0; i <= parts; i++){
  let b = 150 - i*part_width;
  let hipotenusa = Math.sqrt(b*b + start_radius*start_radius);
  ctx.beginPath();
  ctx.moveTo(150, 250);  
  //поворачиваю точку с нужной длиной на нужный угол
  ctx.lineTo(
    150 + hipotenusa*Math.sin(i*part_angle + Math.PI*0.75),
    250 + hipotenusa*Math.cos(i*part_angle + Math.PI*0.75));
  ctx.stroke();
}
<canvas width="500" height="500" id="canv"></canvas>

如果您不将线连接到一个点,会发生以下情况(没有极坐标,它可能会有所帮助)

在此处输入图像描述

javascript
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Вася Воронцов
    2022-07-10T00:18:16Z2022-07-10T00:18:16Z

    解决方案#1。等角。

    代码由几个部分组成:

    1. 第一个变量块是服务,必须表示解决方案;
    2. 第二个变量块 - 所描绘图形的参数;
    3. 实际解决方案作为单独的功能。

    在解决方案中,我们首先确定线段末端的极角,然后 - 角的均匀增量的值。当角度发生变化时,极半径会发生变化,其长度是从一个直角三角形中找到的,直角三角形的一条腿垂直于直线,斜边是绘制的线段。

    var canvas = document.getElementById("canvas");
    var context = canvas.getContext("2d");
    var width = canvas.offsetWidth;
    var height = canvas.offsetHeight;
    var centerX = width >> 1;
    var centerY = height >> 1;
    canvas.width = width;
    canvas.height = height;
    
    let lineAngle = 0.2; // угол направляющей прямой
    let lineLength = 200; // длина прямой
    let startAngle = Math.PI/2+0.4; // положение начальной точки (угол)
    let startDist = 50; // положение начальной точки (расстояние до центра)
    let divCount = 20; // количество делений
    
    drawLinePolar();
    
    function drawLinePolar() {
        let startX = centerX + startDist * Math.cos(startAngle);
        let startY = centerY - startDist * Math.sin(startAngle);
        let finishX = startX + lineLength * Math.cos(lineAngle);
        let finishY = startY - lineLength * Math.sin(lineAngle);
        let finishAngle = Math.atan2(-finishY+centerY, finishX-centerX);
        let deltaAngle = (finishAngle - startAngle) / divCount;
        let normAngle = lineAngle + Math.PI/2;
        let normDist = startDist * (Math.cos(startAngle) * Math.cos(normAngle) + Math.sin(startAngle) * Math.sin(normAngle));
        context.beginPath();
        for (let i = 0; i <= divCount; i++) {
            let currentAngle = startAngle + i * deltaAngle;
            let da = -currentAngle + normAngle;
            let l = normDist / Math.cos(da);
            let x = l * Math.cos(currentAngle);
            let y = l * Math.sin(currentAngle);
            context.moveTo(centerX, centerY);
            context.lineTo(centerX+x, centerY-y);
        }
        context.stroke();
        
    // проверка /*
        context.beginPath();
        context.moveTo(startX, startY);
        context.lineTo(finishX, finishY);
        context.strokeStyle = "#f00";
        context.lineWidth = 2;
        context.stroke();
    // проверка */
    }
    #canvas {
        width: 100vw;
        height: 100vh;
    }
    <canvas id="canvas"></canvas>

    解决方案#2。平等削减。

    在这里,我们确定线段末端之间的坐标差异,并将其划分为所需数量的部分。

    var canvas = document.getElementById("canvas");
    var context = canvas.getContext("2d");
    var width = canvas.offsetWidth;
    var height = canvas.offsetHeight;
    var centerX = width >> 1;
    var centerY = height >> 1;
    canvas.width = width;
    canvas.height = height;
    
    let lineAngle = 0.2; // угол направляющей прямой
    let lineLength = 200; // длина прямой
    let startAngle = Math.PI/2+0.4; // положение начальной точки (угол)
    let startDist = 50; // положение начальной точки (расстояние до центра)
    let divCount = 20; // количество делений
    
    drawLinePolar();
    
    function drawLinePolar() {
        let startX = centerX + startDist * Math.cos(startAngle);
        let startY = centerY - startDist * Math.sin(startAngle);
        let finishX = startX + lineLength * Math.cos(lineAngle);
        let finishY = startY - lineLength * Math.sin(lineAngle);
        let dx = (finishX - startX) / divCount;
        let dy = (finishY - startY) / divCount;
        context.beginPath();
        for (let i = 0; i <= divCount; i++) {
            context.moveTo(centerX, centerY);
            context.lineTo(startX+dx*i, startY+dy*i);
        }
        context.stroke();
    
    // проверка /*
        context.beginPath();
        context.moveTo(startX, startY);
        context.lineTo(finishX, finishY);
        context.strokeStyle = "#f00";
        context.lineWidth = 2;
        context.stroke();
    // проверка */
    }
    #canvas {
        width: 100vw;
        height: 100vh;
    }
    <canvas id="canvas"></canvas>

    • 2
  2. Best Answer
    user176262
    2022-07-10T00:13:32Z2022-07-10T00:13:32Z

    这里没有什么有趣的。出于某种原因,您决定您正在i*part_width绘制的线段末端的水平坐标的线性变化对应于角度的线性变化 - i*part_angle。当然,这不是真的。

    如果您从一开始就知道线段末端的坐标,为什么通常需要斜边、角度、正弦和余弦?

    • 1

相关问题

  • 第二个 Instagram 按钮的 CSS 属性

  • 由于模糊,内容不可见

  • 弹出队列。消息显示不正确

  • 是否可以在 for 循环中插入提示?

  • 如何将 JSON 请求中的信息输出到数据表 Vuetify vue.js?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5