- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最佳答案
您正在画很多圆圈
函数:编写可重用代码的有效方法!
您可以创建可重用的函数,该函数接受特定于圆的变量并使用这些变量来绘制描边或实心圆,而不是重写(重复)代码来绘制两种类型的圆。
抚摸你的轨道的功能
drawOrbit
函数接受一个半径并以该半径围绕中心点画一个圆:
// cx,cy is the concentric centerpoint of your orbits -- cx,cy don't change
// radius is how far your orbit is from the centerpoint -- radius does change
function drawOrbit(radius){
ctx.beginPath();
ctx.arc(cx,cy,radius,0,Math.PI*2);
ctx.stroke();
}
绘制轨道体(圆圈)的函数
circleInOrbit
函数接受一个半径并以该半径围绕中心点画一个圆:
x,y
通过三 Angular 函数计算。cx,cy
是轨道中心点orbits[circle.orbitIndex]
从轨道数组中获取轨道对象。然后轨道对象告诉函数轨道距离中心点有多远。Math.cos(angle) & Math.sin(angle)
告诉函数轨道圆在轨道圆周上的哪个位置drawOrbitingCircle
函数如下所示:
// Takes in a circle object that holds the circle's orbit & rotation angle
// It draws the orbiting circle on the specified orbit at the specified angle
function drawOrbitingCircle(circle){
var x=cx+orbits[circle.orbitIndex]*Math.cos(circle.angle);
var y=cy+orbits[circle.orbitIndex]*Math.sin(circle.angle);
ctx.beginPath();
ctx.arc(x,y,circleRadius,0,Math.PI*2);
ctx.fillStyle='lightgray';
ctx.fill();
ctx.strokeStyle='white';
ctx.stroke();
}
[添加:显示带符号的中心圆并防止重叠圆]
此函数绘制一个包含您的文本符号(加号)的蓝色实心圆圈:
请注意,您可以使用 context.textAlign = 'center'
将文本水平和垂直居中对齐。和context.textBaseline = 'middle'
.
function drawSignedCenterCircle(signCharacter){
ctx.beginPath();
ctx.arc(cx,cy, 18, 0, 2 * Math.PI);
ctx.fillStyle='blue';
ctx.fill();
ctx.fillStyle='white';
ctx.font='24px verdana';
ctx.textAlign='center';
ctx.textBaseline='middle';
ctx.fillText(signCharacter,cx,cy);
}
此代码创建不会重叠的轨道圆。
它的工作原理是为每个轨道圈提供一个独特的轨道切片。由于每个切片都是唯一的,因此任何圆都不会与同一轨道上的任何其他圆重叠。
// calculate non-overlapping placements of orbiting bodies
for(var o=0;o<orbits.length;o++){
var count=circleCountByOrbit[o];
var sweep=Math.PI*2/count;
for(var c=0;c<count;c++){
var midAngle=(sweep*c)+sweep/2;
var randomOffset=Math.random()*0.50-1;
var angle=midAngle+sweep*randomOffset;
circles.push({orbitIndex:o, angle:angle});
}
}
示例代码和演示:
var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");
var cw=canvas.width;
var ch=canvas.height;
function reOffset(){
var BB=canvas.getBoundingClientRect();
offsetX=BB.left;
offsetY=BB.top;
}
var offsetX,offsetY;
reOffset();
window.onscroll=function(e){ reOffset(); }
window.onresize=function(e){ reOffset(); }
$("#canvas").mousedown(function(e){handleMouseDown(e);});
var cx=cw/2;
var cy=ch/2;
var circleRadius=10;
var blueRadius=18;
var orbits=[40,80,120];
var circleCountByOrbit=[3,5,7];
var circles=[];
// calculate non-overlapping placements of orbiting bodies
for(var o=0;o<orbits.length;o++){
var count=circleCountByOrbit[o];
var sweep=Math.PI*2/count;
for(var c=0;c<count;c++){
var midAngle=(sweep*c)+sweep/2;
var randomOffset=Math.random()*0.50-1;
var angle=midAngle+sweep*randomOffset;
var x=cx+orbits[o]*Math.cos(angle);
var y=cy+orbits[o]*Math.sin(angle);
circles.push({
cx:x, cy:y,
radius:circleRadius,
orbitIndex:o,
angle:angle
});
}
}
// draw the stroked orbits
for(var i=0;i<orbits.length;i++){
drawOrbit(orbits[i]);
}
// draw the orbiting bodies
for(var i=0;i<circles.length;i++){
drawOrbitingCircle(circles[i]);
}
// draw the signedCenterCircle
drawSignedCenterCircle('+');
function drawOrbit(radius){
ctx.beginPath();
ctx.arc(cx,cy,radius,0,Math.PI*2);
ctx.stroke();
}
function drawOrbitingCircle(circle){
x=circle.cx;
y=circle.cy;
ctx.beginPath();
ctx.arc(x,y,circleRadius,0,Math.PI*2);
ctx.fillStyle='lightgray';
ctx.fill();
ctx.strokeStyle='white';
ctx.stroke();
}
function drawSignedCenterCircle(signCharacter){
ctx.beginPath();
ctx.arc(cx,cy, blueRadius, 0, 2 * Math.PI);
ctx.fillStyle='blue';
ctx.fill();
ctx.fillStyle='white';
ctx.font='24px verdana';
ctx.textAlign='center';
ctx.textBaseline='middle';
ctx.fillText(signCharacter,cx,cy);
}
function handleMouseDown(e){
// tell the browser we're handling this event
e.preventDefault();
e.stopPropagation();
mouseX=parseInt(e.clientX-offsetX);
mouseY=parseInt(e.clientY-offsetY);
// Check if mouse is inside any orbiting circle
for(var i=0;i<circles.length;i++){
var c=circles[i];
var dx=mouseX-c.cx;
var dy=mouseY-c.cy;
if(dx*dx+dy*dy<c.radius*c.radius){
drawOrbitingCircle(circles[i]);
ctx.fillStyle='red';
ctx.fill();
}
}
// Check if mouse is inside any orbiting circle
var dx=mouseX-cx;
var dy=mouseY-cy;
if(dx*dx+dy*dy<blueRadius*blueRadius){
alert('You clicked in blue circle');
}
}
body{ background-color:white;padding:20px;}
#canvas{border:1px solid red; margin:0 auto; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<h4>Click in a circle.</h4>
<canvas id="canvas" width=300 height=300></canvas>
关于javascript - JS 中的径向形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37408547/
我正在尝试快速创建一个径向 CAGradientLayer。普通 CAGradientLayers(默认类型 axial)没有问题。它们在模拟器中的快照和运行时呈现良好。 当我拍摄我创建的 UIVie
我想用 CSS 制作一个径向进度指示器,它的中间圆圈是透明的。看这里:http://codepen.io/geedmo/pen/InFfd – 这是我想要做的事情的完美示例,但中间 (.overlay
我已经编写了用于生成网络图的 UI、服务器和 global.r。它适用于一种布局(layout.fruchterman.reingold)。我想要一个用于列出布局的单选按钮(径向、对角线网络和 den
我正在使用 jqwidgets。在那些小部件中,我使用的是径向量规。对于那个径向仪表,我想给出径向背景色。我有一个类似这样的代码,用于更改径向仪表中的背景颜色。 $('#gauge').jqxGaug
有谁知道我可以用来为 iOS 应用程序创建饼图(径向)菜单的库(开源或其他)? 看来现在应该有人想到了这一点,如果没有必要,我不愿意自己动手。 最佳答案 我不久前发现的一个。 http://www
我正在使用 this code为我的数据获取径向 TreeMap 。但是,我想修改它以避免弯曲链接。相反,我对线性直接连接感兴趣。弯曲的链接使插图不那么复杂,特别是当我们的子节点数量较少时。例如,您可
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 8 年前。 Improve this qu
我正在使用 chrome 18.0.1025.162 并尝试进行径向渐变 -webkit-radial-gradient(circle, rgba(100, 100, 100, 0.2), rgba(
我想呈现漂亮的径向树布局,但有点被弯曲的边缘绊倒了。问题是源点和目标点之间的角度不同,边缘的绘制方式也不同。提供的图片来自单个图表,因此您可以看到它们在不同边缘方向上有何不同。我认为关键在于 beiz
我希望我的工具栏使用 Material 设计径向 react 编排指南改变颜色 我想将其实现为 Angular 2 过渡,但我不知 Prop 体该怎么做: 看起来像这样.. @Component({
我目前正在使用以下代码绘制形状; GLfloat vertex = // vertex points glLineWidth(2); glEnableClientState(GL_VERTEX_ARR
我是一名优秀的程序员,十分优秀!