首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何创建始终打开不动点的弧线

如何创建始终打开不动点的弧线
EN

Stack Overflow用户
提问于 2015-01-08 09:06:50
回答 2查看 402关注 0票数 2

我试图在画布上创造一种向日葵效果,用弧线,我的几何学技巧生锈了。

首先,我在画布的中间创建了一个原点, (X1,Y1),然后创建鼠标位置Mp (Xm,Ym)。

现在,如果我做了一条从到Mp的虚线,那么Mp应该是用一个新的较小的原点平分弧的点,这个点是在起源的方向上,它将定义一个静态半径的弧(例如20)。所有三点,Mp和较小的半径应该形成一条直线。

我想要它通过一个静态半径(比如说20)的弧线中心,而不管鼠标离原产地有多远。

所以,如果你想象一个时钟。如果手连接的中间部分是。

  • 如果鼠标处于3点钟的位置,弧线看起来就像“)
  • 如果鼠标处于9点钟的位置,弧线看起来就像“(
  • 如果鼠标处于12点的位置,弧线看起来就像“”(如果它被旋转了90°)
  • 如果鼠标处于6点钟的位置,弧线看起来就像“”(如果它被旋转270°)
  • 等等。

鼠标就在弧形上。

对于我的问题,具体而言,问题不在于如何获得积分、鼠标事件或其他东西,而是假设我有{X1,Y1}和{Xm,Ym},如上面所述,创建弧线所需的数学是什么?

或者对于JS/jQuery专家来说,arc() params?

编辑:一个非常糟糕的photoshop渲染

右下角有一个鼠标,用于显示绘制弧线/曲线时鼠标指针的一般位置。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-08 10:51:32

最简单的方法是调整弧命令.的起始角和结束角。

你可以画一系列的弧线来形成你的花。

提示:如果你希望你的花瓣不那么圆,更弯曲,你可以使用quadraticCurveTo而不是弧形来画花瓣的外部。

祝你的项目好运!

代码语言:javascript
运行
AI代码解释
复制
var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");
var cw=canvas.width;
var ch=canvas.height;

var cx=150;
var cy=150;
var radius=50;
var PI=Math.PI;
var startAngle=0-PI/8;
var sweepAngle=PI/4;
var nextTime=0;
var delay=250;

requestAnimationFrame(animate);

function draw(){

  ctx.clearRect(0,0,cw,ch);

  ctx.beginPath();
  ctx.arc(cx,cy,5,0,PI*2);
  ctx.closePath();
  ctx.fill();

  ctx.beginPath();
  ctx.arc(cx,cy,radius,startAngle,startAngle+sweepAngle);
  ctx.stroke();

}

function animate(time){
  requestAnimationFrame(animate);
  if(time>nextTime){
    draw();
    startAngle+=PI*2/30;
    nextTime+=delay;
  }
}
代码语言:javascript
运行
AI代码解释
复制
body{ background-color: ivory; padding:10px; }
#canvas{border:1px solid red;}
代码语言:javascript
运行
AI代码解释
复制
<canvas id="canvas" width=300 height=300></canvas>

基于更多信息的加法

是的,我想你搞定了!

从鼠标位置mcx,mcy开始。

定义一个较小的圆心点相对于鼠标位置radianAngle的角度。

定义这个小中心点离鼠标中心点radius有多远。

计算小圆的中心点:

代码语言:javascript
运行
AI代码解释
复制
var scx = mcx + radius*Math.cos(radianAngle);
var scy = mcy + radius*Math.sin(radianAngle);

定义较小圆smallRadius的半径。

在较小的弧形sweepAngle上定义所需的总sweepAngle

在你的小圆圈上定义弧的开始和结束角。这实际上很容易,因为您希望小弧“点”在鼠标点。提示:小弧的中心必须始终位于radianAngle的中点。因此,startingAngle = ( radianAngle - sweepAngle/2

最后,你的“指向”鼠标的小角度变成:

代码语言:javascript
运行
AI代码解释
复制
ctx.arc( scx,scy, smallRadius, startingAngle, startingAngle+sweepAngle );

干杯!

票数 2
EN

Stack Overflow用户

发布于 2015-01-09 14:07:14

添加仅仅是因为:

代码语言:javascript
运行
AI代码解释
复制
$(document).ready(function() {
      var canvas = $('#canvas');

      function getPosition(mouseEvent) {
        var x, y;
        x = mouseEvent.clientX;
        y = mouseEvent.clientY;
        return {
          X: x - canvas.offset().left,
          Y: y - canvas.offset().top
        };
      }

      $('#canvas').mousemove(function(e) {
        var origin = {
          x: 325,
          y: 100
        };
        var posit = getPosition(e)
        var degrees = Math.PI /
          180;
        var plotR = {
          X: 0,
          Y: 0
        };
        var radius = 15;
        var curveDeg = 65;
        var context = $('#canvas').get(0).getContext('2d');

        if (posit.X >= origin.x && posit.Y <= origin.y) {
          quadrant = 1;
        } else if (posit.X >= origin.x && posit.Y >= origin.y) {
          quadrant = 2;
        } else if (posit.X < origin.x && posit.Y >= origin.y) {
          quadrant = 3;
        } else {
          quadrant = 4;
        }

        deltaY = posit.Y - origin.y;
        deltaX = posit.X - origin.x;

        if (deltaX == 0) {
          distance = deltaY;
          plotR.X = origin.x;
          switch (quadrant) {
            case 2:
            case 3:
              plotR.Y = posit.Y - radius;
              break;
            case 1:
            case 4:
            default:
              plotR.Y = posit.Y + radius;
              break;
          }
        } else {
          distance = Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));
          slope = deltaY / deltaX;
          delta = radius / (Math.sqrt(1 + Math.pow(slope, 2)));

          switch (quadrant) {
            case 1:
              plotR.Y = posit.Y - slope * delta;
              plotR.X = posit.X - delta;
              break;
            case 2:
              plotR.Y = posit.Y - slope * delta;
              plotR.X = posit.X - delta;
              break;
            case 3:
              plotR.Y = posit.Y + slope * delta;
              plotR.X = posit.X + delta;

              break;
            case 4:
            default:
              plotR.Y = posit.Y + slope * delta;
              plotR.X = posit.X + delta;
              break;
          }
        }
        startAngle = Math.acos(deltaX / distance);
        if (quadrant == 1 || quadrant == 4) startAngle = -startAngle;


        context.clearRect(0, 0, 900, 400);

        // Draw Origin Point for reference, but not for production
        context.beginPath();
        context.lineWidth = 1;
        context.fillStyle = "#0000FF";
        context.strokeStyle = "#0000FF";
        context.arc(origin.x, origin.y, 3, 0, 2 * Math.PI, true);
        context.fill();

        // Drawn Calculated Origin point offset from Mouse in the direction of Origin Point
        context.beginPath();
        context.lineWidth = 1;
        context.fillStyle = "#00FF00";
        context.strokeStyle = "#00FF00";
        context.arc(plotR.X, plotR.Y, 3, 0, 2 * Math.PI, true);
        context.fill();

        // Draw 'Sunflower' Curve
        context.beginPath();
        context.lineCap = 'round';
        context.lineWidth = 3;
        context.strokeStyle = "#FF0000";
        context.arc(plotR.X, plotR.Y, radius, startAngle - (curveDeg * degrees / 2), startAngle + (curveDeg * degrees / 2), false);

        context.stroke();
        return;
      });
    });
代码语言:javascript
运行
AI代码解释
复制
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<canvas id="canvas" width="650" height="200" style=" border: 1px #000 solid"></canvas>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27845682

复制
相关文章
不动点与递归数列的极限有关吗_递推数列不动点法
有些收敛的数列才有不动点,比如x=1+x^(-1) ;x=1+x^(-2);x=1+x^(-3),下面写程序验证:
全栈程序员站长
2022/10/01
3760
【Openxml】将Openxml的椭圆弧线arcTo转为Svg的椭圆弧线
因此实际上,我们需要求出的则是圆弧终点坐标就能够完成最终换算到Svg椭圆弧线字符串了
ryzenWzd
2021/09/01
1K0
LeetCode 1064. 不动点(二分查找)
给定已经按升序排列、由不同整数组成的数组 A,返回满足 A[i] == i 的最小索引 i。 如果不存在这样的 i,返回 -1。
Michael阿明
2020/07/13
5140
python之turtle模块-弧线
前面已经画过圆了,那么画弧线就会容易很多。知道弧的度数之后,实际上只需要画相应部分的圆就可以得到想要的弧。
生信交流平台
2020/08/06
2.7K0
python之turtle模块-弧线
一点点从坑里爬出来:如何正确打开 WPF 里的 Popup?
在 WPF 中打开一个 Popup 并没有想象当中容易。虽说提供了一个 IsOpen 属性用于显示 Popup,但实际上造成的 Bug 会让你解得死去活来。Win32 的 WS_POPUP 也坑,不过 WPF 会额外再带来一些,所以本文只说 WPF。
walterlv
2023/10/22
6850
Python文件处理:创建、打开、追加、
在Python中,不需要导入外部库来读取和写入文件。Python为创建、写入和读取文件提供了内置的函数。
py3study
2020/01/06
2.3K0
如何科学的打开 Leetcode
Leetcode 对于学计算机专业的同学,就如 PhotoShop 对于学设计的同学来说,最熟悉不过了。
五分钟学算法
2019/10/30
1.2K0
如何科学的打开 Leetcode
如何科学的打开 Leetcode?
Leetcode 对于学计算机专业的同学,就如 PhotoShop 对于学设计的同学来说,最熟悉不过了。
GitHubDaily
2019/11/01
1.3K0
如何科学的打开 Leetcode?
如何打开DNSSEC?
DNS(域名系统)类似于Internet的电话簿:它告诉计算机在哪里发送信息,在什么地方搜索信息。遗憾的是,它也接受因特网提供给它的任何地址,这并不成问题。
幻影龙王
2021/09/08
2.2K0
GO语言文件的创建与打开实例分析
文件操作是个很重要的话题,使用也非常频繁,熟悉如何操作文件是必不可少的。Golang 对文件的支持是在 os package 里,具体操作都封装在 type File struct {} 结构体中。 一、func Open(name string) (file *File, err error) 再简单不过了,给一个路径给它,返回文件描述符,如果出现错误就会返回一个 *PathError。 这是一个只读打开模式,实际上就是 os.OpenFile() 的快捷操作,它的原型如下: func Open(nam
李海彬
2018/03/26
9960
创建线程的方式打开记事本
今天操作系统课老师讲到进程,提出了一个有趣的小实验:能否以系统调用的方式利用 Windows 创建进程的系统调用函数来打开一个软件。闲着蛋疼的我立马来了兴趣,姑且写一个玩玩(
浪漫主义狗
2023/09/20
2920
创建线程的方式打开记事本
打开IDEA的更新选项,如何打开IDEA更新弹窗
在最下方有个Do not show this dialog in the future的勾选框
noteless
2019/09/06
3.3K0
打开IDEA的更新选项,如何打开IDEA更新弹窗
GO语言文件的创建与打开实例分析
文件操作是个很重要的话题,使用也非常频繁,熟悉如何操作文件是必不可少的。Golang 对文件的支持是在 os package 里,具体操作都封装在 type File struct {} 结构体中。 一、func Open(name string) (file *File, err error) 再简单不过了,给一个路径给它,返回文件描述符,如果出现错误就会返回一个 *PathError。 这是一个只读打开模式,实际上就是 os.OpenFile() 的快捷操作,它的原型如下: func Open(nam
李海彬
2018/03/22
8400
pycharm如何打开原来的项目_terminal怎么打开
Pycharm的下方工具栏中有两个窗口:Python Console和Terminal(如下图)
全栈程序员站长
2022/09/27
3.1K0
pycharm如何打开原来的项目_terminal怎么打开
Unity【InitializeOnLoadMethod】- 如何在项目工程打开时创建一个窗口
我们在Unity中安装的一些插件、工具,会在工程打开时弹出一个相关介绍的窗口,实现这样的功能需要用到InitializeOnLoadMethod这个特性,下面是官方文档中关于该特性的介绍:
CoderZ
2022/08/29
1.2K0
Unity【InitializeOnLoadMethod】- 如何在项目工程打开时创建一个窗口
rsync 自动创建目录的坑点
rsync同步文件有三种模式: 1、把源站路径下某个文件,同步到目标路径。例如rsync -aR /data/1/2/3/a.txt 1.1.1.1:/data/ ,目标机器将自动创建多层目录存放a.txt。也可以换不同存放目录,例如rsync -aR /data/1/2/3/a.txt 1.1.1.1:/backup/,得到/backup/data/1/2/3/a.txt。 2、把源站某个目录,同步到目录路径。例如rsync -a /data/1/2/3 1.1.1.1:/data/other/ ,将
用户1258909
2018/07/03
3.1K0
开发者 vs ChatGPT:开发者如何始终赢得比赛?
在不断发展的技术领域,开发人员在塑造我们生活的数字世界方面发挥着至关重要的作用。他们是架构师、问题解决者和创新软件解决方案背后的创造性思维。虽然像 ChatGPT 这样的人工智能模型在自然语言处理方面取得了重大进步,但开发人员仍然是软件开发成功的关键。本文探讨了开发人员始终胜过 ChatGPT 的原因,以及他们独特的技能和能力如何赋予他们制胜优势。
IT千锋教育
2023/06/12
2140
如何打开 plist 文件
plist 文件是一种用于存储应用程序配置信息的文件格式,其中包含应用程序的各种设置和数据。在过去,plist 文件通常是以.plist 格式存储的。然而,随着时间的推移,人们开始使用.plistx 格式来存储更复杂的数据结构和数据。如果您需要将.plist 文件打开,可以使用在线工具或命令行工具。本文将为您介绍如何使用在线工具打开.plist 文件。
iOS程序应用
2023/04/12
2.9K0
如何打开rdb文件
RDB文件是QQ2009SP以后的替代DB文件的一种新的文件格式,是一种数据库文件请下载
全栈程序员站长
2022/07/08
4K0
如何打开rdb文件
如何打开ipynb文件
《如何打开ipynb文件》文章摘要:本文介绍了如何打开.ipynb后缀的文件,并提供了两种方法。第一种方法是直接使用IPython Notebook打开,第二种方法是将.ipynb文件扔进Spyder中打开。使用IPython Notebook打开需要先安装IPython Notebook,而使用Spyder打开则需要先安装Anaconda。两种方法都可以在浏览器窗口上启动Notebook,方便进行交互编程和学习。
chaibubble
2018/01/02
7.6K0
如何打开ipynb文件

相似问题

最小不动点最大不动点

11

如何用两个补不动点加不动点?

10

Django模型:创建小值不动点

13

类型不动点

13

不动点迭代

30
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档