简体   繁体   English

在画布中间创建等边三角形?

[英]Create equilateral triangle in the middle of canvas?

I want to draw an equilateral triangle in the middle of canvas. 我想在画布中间画一个等边三角形。 I tried this: 我试过这个:

ctx.moveTo(canvas.width/2, canvas.height/2-50);
ctx.lineTo(canvas.width/2-50, canvas.height/2+50);
ctx.lineTo(canvas.width/2+50, canvas.height/2+50);
ctx.fill();

But the triangle looks a bit too tall. 但三角形看起来有点太高了。

How can I draw an equilateral triangle in the middle of canvas? 如何在画布中间画一个等边三角形?

Someone told me you have to find the ratio of the height of an equilateral triangle to the side of an equilateral triangle. 有人告诉我你必须找到等边三角形的高度与等边三角形边的比率。

h:s

What are the two numbers? 这两个数字是什么?

The equation for the three corner points is 三个角点的等式是

x = r*cos(angle) + x_center
y = r*sin(angle) + y_center

where for angle = 0, (1./3)*(2*pi), and (2./3)*(2*pi); 其中,角度= 0,(1./3)*(2 * pi),(2./3)*(2*pi); and where r is the radius of the circle in which the triangle is inscribed. 其中r是刻有三角形的圆的半径。

You have to do it with the height of the triangle 你必须用三角形的高度来做

var h = side * (Math.sqrt(3)/2);

or 要么

var h = side * Math.cos(Math.PI/6);


So the ratio h:s is equal to: 所以比率h:s等于:

sqrt( 3 ) / 2 : 1 = cos( π / 6 ) : 1 ≈ 0.866025


See : http://jsfiddle.net/rWSKh/2/ 请参阅: http//jsfiddle.net/rWSKh/2/

A simple version where X and Y are the points you want to top of the triangle to be: 一个简单的版本,其中X和Y是您想要在三角形顶部的点:

var height = 100 * (Math.sqrt(3)/2);
context.beginPath();
context.moveTo(X, Y);
context.lineTo(X+50, Y+height);
context.lineTo(X-50, Y+height);
context.lineTo(X, Y);
context.fill();
context.closePath();

This makes an equilateral triange with all sides = 100. Replace 100 with how long you want your side lengths to be. 这使得所有边的等边距离= 100.将你想要的长度替换为100。

After you find the midpoint of the canvas, if you want that to be your triangle's midpoint as well you can set X = midpoint's X and Y = midpoint's Y - 50 (for a 100 length triangle). 找到画布的中点后,如果你想将它作为三角形的中点,你可以设置X =中点的X和Y =中点的Y - 50(对于100长度的三角形)。

my code for drawing triangle also depending on direction (for lines). 我的绘制三角形的代码也取决于方向(对于线条)。 code is for Raphael lib. 代码适用于Raphael lib。

drawTriangle(x2 - x1, y2 - y1, x2, y2);
function drawTriangle(dx, dy, midX, midY) {
        var diff = 0;
        var cos = 0.866; 
        var sin = 0.500; 

        var length = Math.sqrt(dx * dx + dy * dy) * 0.8; 
        dx = 8 * (dx / length); 
        dy = 8 * (dy / length); 
        var pX1 = (midX + diff) - (dx * cos + dy * -sin); 
        var pY1 = midY - (dx * sin + dy * cos); 
        var pX2 = (midX + diff) - (dx * cos + dy * sin); 
        var pY2 = midY - (dx * -sin + dy * cos); 

        return [
                    "M", midX + diff, midY,
                    "L", pX1, pY1,
                    "L", pX2, pY2,
                    "L", midX + diff, midY
                ].join(","); 
    }

The side lengths will not be equal given those coordinates. 给定那些坐标,边长不会相等。

The horizontal line constructed on the bottom has a length of 100, but the other sides are actually the hypotenuse of a 50x100 triangle ( approx. 112). 底部构造的水平线长度为100,但其他边实际上是50x100三角形的斜边(约112)。

I can get you started with drawing an equilateral triangle but I don't have the time to get it centered. 我可以让你开始绘制一个等边三角形,但我没有时间让它居中。

jsFiddle 的jsfiddle

var ax=0;
var ay=0;
var bx=0;
var by=150;

var dx=bx-ax
var dy=by-ay;
var dangle = Math.atan2(dy, dx) - Math.PI / 3;
var sideDist = Math.sqrt(dx * dx + dy * dy);

var cx = Math.cos(dangle) * sideDist + ax;
var cy =  Math.sin(dangle) * sideDist + ay;

var canvas = document.getElementById('equ');
var ctx = canvas.getContext('2d');

ctx.beginPath();  
ctx.moveTo(ax,ay);  
ctx.lineTo(bx,by);  
ctx.lineTo(cx,cy);  

ctx.fill(); 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM