如何计算动力学楔的 fillPatternRotation 角度
您的文本将始终使用此 fillPatternRotation 在 Kinetic 楔形中适当旋转:
fillPatternRotation:Math.PI/2+wedgeAngleDeg*Math.PI/360
其中wedgeAngleDeg 是提供给wedge.angleDeg 的值:
angleDeg: wedgeAngleDeg
您还需要设置适当的楔形 fillPatternOffset 以匹配您的文本图像
您必须将 fillPattern 水平偏移到图像上文本的中点
假设您的文本在图像上水平居中,则该偏移量为 image.width/2。
fillPatternOffset X is image.width/2
您必须垂直偏移 fillPattern 以将图像文本与楔形上的最大宽度对齐。
您可以像这样计算最大的楔形宽度:
var textTop=radius*Math.sin(wedgeAngleDeg*Math.PI/180);
所以你的 fillPatternOffset 变成:
fillPatternOffset: [image.width/2, image.height-textTop],
这是代码和小提琴:http: //jsfiddle.net/m1erickson/Y53cH/
<!DOCTYPE HTML>
<html>
<head>
<style>
body {
margin: 0px;
padding: 0px;
}
</style>
</head>
<body>
<div id="container"></div>
<script src="http://d3lp1msu2r81bx.cloudfront.net/kjs/js/lib/kinetic-v4.6.0.min.js"></script>
<script defer="defer">
var stage = new Kinetic.Stage({
container: 'container',
width: 350,
height: 350
});
var img=new Image();
img.onload=function(){
start();
}
img.src="https://dl.dropboxusercontent.com/u/139992952/stackoverflow/testing.png";
function start(){
var layer = new Kinetic.Layer();
var wedgeAngleDeg=60;
var radius=100;
var textTop=radius*Math.sin(wedgeAngleDeg*Math.PI/180);
var wedge = new Kinetic.Wedge({
x: stage.getWidth() / 2,
y: stage.getHeight() / 2,
radius: radius,
angleDeg: wedgeAngleDeg,
fillPatternImage: img,
fillPatternOffset: [img.width/2, img.height-textTop],
fillPatternRepeat:"no-repeat",
fillPatternRotation:Math.PI/2+wedgeAngleDeg*Math.PI/360,
stroke: 'black',
strokeWidth: 4,
rotationDeg: 0
});
layer.add(wedge);
wedge.setRotationDeg(-45);
// add the layer to the stage
stage.add(layer);
}
</script>
</body>
</html>