Ich arbeite gerade an DirectX und nutze zum ersten mal die DirectXMath Funktionen. Die SIMD Unterstützung ist neu für mich. Das Flag _XM_SSE_INTRINSICS_ ist entsprechend gesetzt.
Von daher wollte ich fragen ob der folgende Code so ok ist:
float GetDistance2D(const DirectX::XMVECTOR& P1, const DirectX::XMVECTOR& P2)
{
DirectX::XMVECTOR delta = DirectX::XMVectorSubtract(P1, P2);
DirectX::XMVECTOR length = DirectX::XMVector2Length(delta);
return DirectX::XMVectorGetX(length);
}
Mein gedankliches Problem: DirectX::XMVECTOR ist ein 4D Vektor, aber ich brauche nur die 2D Distanz. Wäre also der folgende Code schneller?
float GetDistance2D(const DirectX::XMVECTOR& P1, const DirectX::XMVECTOR& P2)
{
float P1x, P1y, P1w;
float P2x, P2y, P2w;
// Bestimme XY von P1
P1w = DirectX::XMVectorGetW(P1);
if (P1w != 0.0f && P1w != 1.0f)
{
P1x = DirectX::XMVectorGetX(P1) / P1w;
P1y = DirectX::XMVectorGetY(P1) / P1w;
}
else
{
P1x = DirectX::XMVectorGetX(P1);
P1y = DirectX::XMVectorGetY(P1);
}
// Bestimme XY von P2
P2w = DirectX::XMVectorGetW(P2);
if (P2w != 0.0f && P2w != 1.0f)
{
P2x = DirectX::XMVectorGetX(P2) / P2w;
P2y = DirectX::XMVectorGetY(P2) / P2w;
}
else
{
P2x = DirectX::XMVectorGetX(P2);
P2y = DirectX::XMVectorGetY(P2);
}
// Berechne nun den Abstand
float DiffX = P1x - P2x;
float DiffY = P1y - P2y;
return sqrt(DiffX * DiffX + DiffY * DiffY);
}