当前位置: 首页 > news >正文

java圆和椭圆的关系_圆与椭圆 - brifuture - 博客园

一个单位圆的方程是 X2 + Y2 = 1,画在坐标系中:

89ace81a7f06dbc003ec546e85855dbd.png

对于圆来说,由于它是高度对称的,旋转属性对它而言意义不大。

在 canvas 画布上绘制一个圆很简单,有两种方法:

1. 使用 html5 中提供的 drawArc API

2. 我们也可以用公式  X2 + Y2 = 1,将 X 从 -1 到 1 中每个微元 dx 对应的纵坐标一个个算出来,然后再将这些点连接起来,只要切割的足够细,那么绘制出来的图形就越接近圆。

只是需要注意的是对于 1 个 x,可能有两个 Y 值与之对应。

3. 我们也可以换一种坐标方程,使用极坐标来表示单位圆,x = cos(θ), y = sin(θ)。θ 在 [0, 2π) 区间内,对于每一个 θ,有唯一的 x, y。

如果不使用 html5 中的 api,绘图的时候选择极坐标方程进行取点会方便很多。

先定义一个方法 drawWithLine:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 functiondrawWithLine( v ) {2 ctx.beginPath();3

4 ctx.moveTo( v[0], v[1] );5 for( let i = 1; i <= v.numItems; i++) {6 ctx.lineTo( v[ i * 2 ], v[ i * 2 + 1] );7 }8 ctx.stroke();9

10 ctx.closePath();11 }

View Code

然后计算出圆上的各点(注意点的顺序)

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 //calcVertex() {

2 let seg = this.seg;3 let r = this.r;4 let ox, oy;5

6 let vertex =[];7 vertex.itemSize = 2;8

9 for( let i = 0; i <= seg; i++) {10 ox = Math.cos( 2 * Math.PI * i / seg ) *r;11 oy = Math.sin( 2 * Math.PI * i / seg ) *r;12 vertex.push( ox, oy );13 }14

15 vertex.numItems = vertex.length /vertex.itemSize;16 this.vertex =vertex;17 return this;18 //}

View Code

将计算出来的点传入 drawWithLine 函数中,就能得到上述图形。

那么如果我们想要绘制椭圆呢,对于一个方程为   X2 + XY + Y2 = 1 的椭圆,我想到的方法是将 Y 表示成 X 的函数,根据 X 的可能取值逐个计算对应的 Y 值,

但是由于 Y 的最高次为 2 次,计算出的 Y 值可能是正值或负值,必须将这两种符号的值分开绘制,否则使用 drawWithLine 方法绘制的椭圆会很奇怪,计算椭圆的顶点:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 //testOval() {

2 const radius = 10000;3 const xMax = Math.sqrt( 4 / 3 *radius );4 const xMin = -xMax;5 const seg = 100;6 const segLength = xMax * 2 /seg;7 let x, y;8 let vertex =[];9 vertex.itemSize = 2;10 for( let i = 0; i <= seg; i++) {11 x = xMin + segLength *i;12 y = Math.sqrt( radius - 0.75 * x * x ) - 0.5 *x;13 vertex.push( x, y );14 }15 for( let i = 0; i <= seg; i++) {16 x = xMax - segLength *i;17 y = - Math.sqrt( radius - 0.75 * x * x ) - 0.5 *x;18 vertex.push( x, y );19 }20 vertex.numItems = vertex.length /vertex.itemSize;21 this._testVertex =vertex;22 //}

View Code

64f9e192565962a65ff2c7d95397cb49.png

wiki 百科上对椭圆的介绍:

8c0cd913fef829dc87fbe79b1866f8c0.png

如果我们使用 X2 + XY + Y2 = 1 的系数矩阵 A' = [ 1, 0.5; 0.5; 1 ] 对已经得到的圆(半径为 100 个像素)上各点坐标进行一个坐标变换,得到的图形并没有与前面生成的那个椭圆重合(下方的红色椭圆):

d78208fc7aaa44abc8850c461fc51f8a.png

但是如果我们把系数矩阵中的值进行调整的话,比如调整成:[ 1.12, 0.3; 0.3, 1.12 ],(注意到这个位置,第 1 个系数要和第 4 个系数相同,第 2 个系数和第 3 个系数相同)那么经过矩阵变换后得到的椭圆与蓝色的椭圆重合度非常高:

5686f6cc85994d19ac1a381f1ebc92e6.png

如果只是从圆想得到一个任意平移和旋转的椭圆,可以尝试先将单位圆上的 X 坐标进行矩阵变换,然后对每一个顶点进行矩阵平移和旋转的操作,就可以得到一个任意的椭圆。

如果把 [ 1.12, 0.3; 0.3, 1.12 ] 看成是 [ acos(θ), -bsin(θ); bsin(θ), acos(θ) ],对圆上的坐标进行变换,那么似乎有点道理。

对于其中的具体细节,目前还不了解,以后再继续研究吧。

参考

相关文章:

  • java attributelist_java集合类(二)List学习
  • java ccf认证解答_CCF认证考试(java)---窗口
  • java 平滑 停止_设计Java应用程序的平滑停止
  • java开发按键精灵_Java 按键精灵
  • java同步开销_java – 为什么对Map的同步访问会增加大量的开销
  • java字节码常量池_Java字节码常量池深度剖析与字节码整体结构分解
  • java控制语句案例_Java基础之流程控制(示例代码)
  • mysql 怎么设置ip地址_Mysql如何设置用户指定ip地址操作数据库
  • android_iphone和java三个平台一致的加密方法_Android、iPhone和Java三个平台一致的加密工具...
  • java最崇拜谁_蓝桥杯(java)个人赛真题:小朋友崇拜圈
  • java数组函数结局实际问题_java函数与数组
  • java登录字符串封装_JAVA的随机的字符串的封装(基本上够用了)
  • java统一管理文字_为了统一管理组件和容器,Java为所有组件类定义的超类
  • django mysql 分表_Django数据库分表
  • php aws_Amazon S3 客户端加密与 AWS SDK for PHP 版本 3 - 适用于 PHP 的 AWS 开发工具包...
  • [NodeJS] 关于Buffer
  • 2017前端实习生面试总结
  • Java新版本的开发已正式进入轨道,版本号18.3
  • leetcode-27. Remove Element
  • Yeoman_Bower_Grunt
  • 关于for循环的简单归纳
  • 前端性能优化--懒加载和预加载
  • 如何解决微信端直接跳WAP端
  • 如何利用MongoDB打造TOP榜小程序
  • 入口文件开始,分析Vue源码实现
  • 算法---两个栈实现一个队列
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • #define 用法
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • $refs 、$nextTic、动态组件、name的使用
  • (1) caustics\
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (LeetCode C++)盛最多水的容器
  • (SpringBoot)第二章:Spring创建和使用
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (四)汇编语言——简单程序
  • (推荐)叮当——中文语音对话机器人
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (转)iOS字体
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET 动态调用WebService + WSE + UsernameToken
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .NET下的多线程编程—1-线程机制概述
  • .Net转前端开发-启航篇,如何定制博客园主题