2016-04-09 89 views
3

我有一个SKSpriteNode,它是一个等边三角形的图像,我想将它设置为三角形质心处的定位点,这样我就可以平稳地旋转并保持居中。我已经用下面的代码计算了质心,但是这些位置是相对于场景的,所以我不确定如何将它转换为定位点(0和1之间)的精确小数。为定位点计算SKSpriteNode的质心

let XA = triangle.position.x - (triangle.size.width/2) // left point 
    let XB = triangle.position.x // top point 
    let XC = triangle.position.x + (triangle.size.width/2) // right point 

    let YA = triangle.position.y - (triangle.size.height/2) // left point 
    let YB = triangle.position.y + (triangle.size.height/2) // top point 
    let YC = triangle.position.y - (triangle.size.height/2) // right point 

    let triCenterX = (XA + XB + XC)/3.0 
    let triCenterY = (YA + YB + YC)/3.0 

    let centroid = CGPointMake(triCenterX, triCenterY) // 207.0, 412.65 

    // triangle.anchorPoint = CGPoint(x: , y:) 

我不确定如果我在正确的轨道上或从这里出发,也许我需要以不同的方式做到这一点?任何帮助将不胜感激,谢谢。

回答

1

如果我理解正确的话,这是你现在所看到的:

Rotating around default anchor point

黄点代表三角形边界框的质心。透明的白色矩形表示三角形的边界框。黑点是等边三角形的实际质心。所以,现在,三角形的纹理正在围绕黄点旋转?对?

但是你想是这样的:

Rotating around modified anchor point

你想纹理位上移,所以它看起来像三角形正在围绕其旋转的心?

如果是这样,我这样做,通过计算在三角形的一个三角形的A,B和C点的坐标的空间,这样的:

let xa = -triangle.size.width/2.0 
let xb = triangle.size.width/2.0 
let xc = CGFloat(0.0) 

let ya = -triangle.size.height/2.0 
let yb = -triangle.size.height/2.0 
let yc = triangle.size.height/2.0 

然后,基于计算公式等边三角形的重心,我“VE计算三角形的质心:

let centroidX = (xa + xb + xc)/3.0 
let centroidY = (ya + yb + yc)/3.0  
let centroid = CGPoint(x: centroidX, y: centroidY) 

,并基于质心位置计算出新的定位点:

let anchorX = centroidX/triangle.size.width 
let anchorY = centroidY/triangle.size.height 
let anchor = CGPoint(x: anchorX + triangle.anchorPoint.x, y: anchorY + triangle.anchorPoint.y) 

这是我所使用的图像:

Equilateral triangle

+0

这正是我需要的,谢谢。 – jm1175