爲了補充Wrikken的回答,下面是一個使用Objective-C和從該線程和其他線程重建的cocos2d-iphone引擎的實際代碼示例。 atan不是必需的,而是使用交叉產品,請參閱代碼示例末尾的C函數和this link。
我也簡單地將偏移矢量的符號從A切換到B,以便從A到C獲得矢量。這樣可以避免兩次調用cosf/sinf。
PS:此代碼在for循環中運行,從i = 0
到i < numVertices
。
CGPoint splinePoint = splinePoints[i];
CGPoint prevPoint = (i == 0) ? splinePoint : splinePoints[i - 1];
CGPoint railPoint = splinePoint;
CGPoint nextPoint = (i == (numVertices-1)) ? splinePoint : splinePoints[i + 1];
CGPoint toPrevPoint = ccpSub(railPoint, prevPoint);
CGPoint toNextPoint = ccpSub(railPoint, nextPoint);
float angleToPrevPoint = ccpAngleSigned(kAngleOriginVector, toPrevPoint);
float angleToNextPoint = ccpAngleSigned(kAngleOriginVector, toNextPoint);
float offsetAngle = 0.0f;
if (i > 0 && i < (numVertices - 1))
{
offsetAngle = angleToNextPoint + ((angleToPrevPoint-angleToNextPoint)/2);
}
else if (i == 0)
{
offsetAngle = angleToNextPoint + M_PI_2;
}
else
{
offsetAngle = angleToPrevPoint + M_PI_2;
}
CGPoint offsetLeftRail, offsetRightRail, offsetRail;
offsetRail.x = cosf(offsetAngle) * railOffsetFromCenter;
offsetRail.y = sinf(offsetAngle) * railOffsetFromCenter;
offsetLeftRail = ccpAdd(railPoint, offsetRail);
offsetRightRail = ccpAdd(railPoint, ccpMult(offsetRail, -1.0f));
if (isPointToTheLeftOfLine(prevPoint, railPoint, offsetLeftRail))
{
leftRailSplinePoints[i] = offsetLeftRail;
rightRailSplinePoints[i] = offsetRightRail;
}
else
{
leftRailSplinePoints[i] = offsetRightRail;
rightRailSplinePoints[i] = offsetLeftRail;
}
BOOL isPointToTheLeftOfLine(CGPoint start, CGPoint end, CGPoint test)
{
return ((end.x - start.x) * (test.y - start.y) -
(end.y - start.y) * (test.x - start.x)) > 0;
}
幫我畫上了鐵路軌道導軌:
確定點位於哪一方更容易積完成。這裏是和示例:http://stackoverflow.com/questions/3461453/determine-which-side-of-a-line-a-point-lies – LearnCocos2D 2012-07-15 13:39:00
@ LearnCocos2D:呃..這是一段時間以前(近2年)但是:在這個問題中,你認爲我們需要「確定一個點在哪一邊」? (1)相對於上一行,但更重要的是(2)一開始就做出選擇/用戶決定,以及使用正值('+')或負值('-')偏移量(在本例中爲5px或-5px)的區別。或者我完全錯過了什麼? – Wrikken 2012-07-15 15:00:19
我的確很欣賞與BTW交叉產品的鏈接,現在閱讀它,但我真的很難看到它與手頭問題的相關性,這是如何幫助計算B點的座標? – Wrikken 2012-07-15 15:03:15