纯js 画圆的方法

2018-05-30  本文已影响19人  买买买买菜

1.给了两个点的坐标,怎样求两点连线的中点坐标?

设两个点是(x1,y1),(x2,y2)
那么两点连线的中点坐标是[(x1+x2)/2,(y1+y2)/2]

2.两点之间的距离计算公式?

两点的坐标是(x1,y1)和(x2,y2)
则两点之间的距离公式为 d=√[(x1-x2)²+(y1-y2)²]

3. 正玄值 余弦值 sin cos?

Math.sin(x) x 的正玄值。返回值在 -1.0 到 1.0 之间;
Math.cos(x) x 的余弦值。返回的是 -1.0 到 1.0 之间的数;

这两个函数中的X 都是指的“弧度”而非“角度”,弧度的计算公式为: 2PI/360角度;
30° 角度 的弧度 = 2PI/36030

4.如何得到圆上每个点的坐标?

根据三角形的正玄、余弦来得值;
假设一个圆的圆心坐标是(a,b),半径为r,
则圆上每个点的X坐标=a + Math.sin(2Math.PI / 360) * r ;Y坐标=b + Math.cos(2Math.PI / 360) * r ;

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>拖动画圆</title>
</head>

<body>
    <style>
        html,
        body {
            margin: 0px;
            padding: 0px;
            font-size: 12px;
        }

        #canvas {
            width: 600px;
            height: 500px;
            margin: 20px auto;
            border: 1px solid #00aa00;
            background: #F8F8F8;
            cursor: crosshair;
            position: relative;
        }

        #canvas div {
            position: absolute;
            width: 1px;
            height: 1px;
            font-size: 1px;
            line-height: 1px;
            overflow: hidden;
            background: #f00;
        }
    </style>

    <div id="canvas"></div>

    <script>
        function circle(x, y, r) {

            var html = [],
                radio, xx, yy;
            html.push("<div style='left:" + (x - 2) + "px; top:" + y + "px; width:5px;'></div>");
            html.push("<div style='left:" + x + "px; top:" + (y - 2) + "px; height:5px;'></div>");

            for (var i = 0.0; i < 360; i += 0.5) {
                radio = i * Math.PI / 180;
                xx = r * Math.cos(radio) + x;
                yy = r * Math.sin(radio) + y;
                html.push("<div style='left:" + xx + "px; top:" + yy + "px;'></div>");
            }
            
            return html.join("");
        }

        function Point(x, y) {
            this.x = x || 0;
            this.y = y || 0;
        }

        function getOffset(obj) {
            var x = 0,
                y = 0;
            do {
                x += obj.offsetLeft;
                y += obj.offsetTop;
                obj = obj.offsetParent;
            } while (obj);
            return new Point(x, y);
        }

        window.onload = function () {
            var canvas = document.getElementById("canvas"),
                origin, pt, offset, isClick = false,
                r, neworigin;

            offset = getOffset(canvas);

            canvas.onmousedown = function (oEvent) {
                oEvent = oEvent || event;
                origin = new Point(oEvent.clientX - offset.x, oEvent.clientY - offset.y);
                isClick = true;
            };

            document.onmousemove = function (oEvent) {
                if (!isClick) {
                    return;
                }

                oEvent = oEvent || event;
                pt = new Point(oEvent.clientX - offset.x, oEvent.clientY - offset.y);

                neworigin = new Point((origin.x + (oEvent.clientX - offset.x)) / 2, (origin.y + (oEvent.clientY -
                    offset.y)) / 2);

                r = Math.sqrt((pt.x - neworigin.x) * (pt.x - neworigin.x) + (pt.y - neworigin.y) * (pt.y -
                    neworigin.y));

                canvas.innerHTML = circle(neworigin.x, neworigin.y, r);
            };

            canvas.onmouseup = function () {
                isClick = false;
            };
        };
    </script>
</body>

</html>
上一篇下一篇

猜你喜欢

热点阅读