多边形画椭圆算法java_运用椭圆画法,45行代码画出随意正多边形

近期做Box2dWeb开发时,想写个创建正多边形的功能。但是因为学识尚浅。我在草稿纸上画了,想了一个上午也没有研究出什么好方法。后来翻抽屉的时候,找出了曾经哥哥画的一张用同心圆画椭圆的示意图。

看到这幅画,我不禁在想椭圆不就是一个N边形吗?圆不就是一个正N边形吗?假设把两个同心圆的半径设定为相等。画出来的椭圆不就是一个圆吗?因此,我立马開始实验。

原本我以为比較难,会用到圆的解析式之类的,没想到就45行代码就搞定了,主要用到的数学知识就是sin和cos。

或许有人不明确怎样用同心圆画椭圆。我就借用网上找的一张图片给大家展示吧

ada0f87689e9b8893fcfc3aaceea63eb.gif

这个画法非常经典,做法简要概括一下就是:

画一个同心圆。然后以圆心为原点画一个二维坐标系;接着用N条过圆心的直线将圆等分,图中所看到的就是4条,把圆等分为了12份。每条直线都会与两个圆有交点。这时候我们就能够确定椭圆上的一个点——设直线与小圆的交点为(a, b)。与大圆的交点为(c, d)。确定的那个点的坐标则为(c, b)。我们有N条直线就会得出2 * N + 4这种点。能够看出,得到的点的坐标通式为:(与大圆的交点的x坐标, 与小圆的交点的y坐标)。要得到这些坐标。我们仅仅用知道直线的条数N和大圆小圆的半径(或直径),然后用sin和cos进行计算就可以。得到这些点后。把这些点连接起来就大致是个椭圆了;假设你把N的数目设定的越大。那么画出来的图形就更接近于椭圆。

与画椭圆不同的是,画正多边形不须要这么复杂。仅仅须要一个圆就够了。并且也不要什么坐标系了,你要N 边形就画N条过圆心的直线,然后这些直线与圆的交点就是多变形的顶点。

把顶点连接起来就是多变形。

如今。我们能够上代码了:

Make Regular Polygon

window.onload = function () {

var canvasTag = document.getElementById("mycanvas");

var c = canvasTag.getContext("2d");

var vertices = getPolygonVertices(7, 100);

c.beginPath();

c.fillStyle = "lightgray";

c.fillRect(0, 0, canvasTag.width, canvasTag.height);

c.translate(canvasTag.width / 2, canvasTag.height / 2);

c.moveTo(vertices[0][0], vertices[0][1]);

for (var i = 1; i < vertices.length; i++) {

c.lineTo(vertices[i][0], vertices[i][1]);

}

c.lineWidth = 5;

c.closePath();

c.stroke();

};

function getPolygonVertices (edges, r) {

var ca = 0, aiv = 360 / edges, ata = Math.PI / 180, list = new Array();

for (var k = 0; k < edges; k++) {

var x = Math.cos(ca * ata) * r,

y = Math.sin(ca * ata) * r;

list.push([x, y]);

ca += aiv;

}

return list;

}

包含canvas渲染和html tag部分,一共45行。真正意义上的算法部分就仅仅在getPolygonVertices函数里。 这个getPolygonVertices有两个參数,第一个參数是edges边数,第二个參数是圆的半径。决定多变形的大小。

算法在前面已经解说过了,非常easy非常基础吧~

执行代码,画出七边形:

b14cf010f922cf44a10eb166a4c0b8bb.png

大家能够试着将getPolygonVertices的第一个參数改一改,画出其它多边形。

Ok,搞定收工~

本文到此结束。欢迎大家交流~

----------------------------------------------------------------

欢迎大家转载我的文章。

欢迎继续关注我的博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java绘制不规则几何图形,比如划曲线,写字,线条随意,如截图所示,甚至可以写出文字:   不规则图形的绘制代码:   public class IrregularShapeDemo extends JFrame {    GeneralPath gPath= new GeneralPath(); //GeneralPath对象实例   //构造函数   public IrregularShapeDemo() {    super("不规则图形的绘制"); //调用父类构造函数    enableEvents(AWTEvent.MOUSE_EVENT_MASK|AWTEvent.MOUSE_MOTION_EVENT_MASK); //允许事件    setSize(300, 200); //设置窗口尺寸    setVisible(true); //设置窗口可视    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //关闭窗口时退出程序    }    public void paint(Graphics g) { //重载窗口组件的paint()方法    Graphics2D g2D = (Graphics2D)g; //获取图形环境    g2D.draw(gPath); //绘制路径    }    public static void main(String[] args) {    new IrregularShapeDemo();    }    protected void processMouseEvent(MouseEvent e) { //鼠标事件处理    if(e.getID() == MouseEvent.MOUSE_PRESSED) {    aPoint = e.getPoint(); //得到当前鼠标点    gPath = new GeneralPath(); //重新实例化GeneralPath对象    gPath.moveTo(aPoint.x,aPoint.y); //设置路径点    }    }    protected void processMouseMotionEvent(MouseEvent e) { //鼠标运动事件处理    if(e.getID() == MouseEvent.MOUSE_DRAGGED) {    aPoint = e.getPoint(); //得到当前鼠标点    gPath.lineTo(aPoint.x, aPoint.y); //设置路径    gPath.moveTo(aPoint.x, aPoint.y);    repaint(); //重绘组件    }    }   }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值