轮子:UE4中计算直线和圆的交点
UE4.18中只提供了判断直线和圆是否相交的API(FMath::LineSphereIntersection),现在有个需求要求交点,只能自己动手写了
TArray<FVector> LineSphereIntersection(const FVector& LineOrigin, const FVector& LineDir, const FVector& circleOrigin, float radius)
{
TArray<FVector> IntersectionPoints;
// 求圆心到直线最近的点
FVector CloestPoint = FMath::ClosestPointOnLine(LineOrigin, LineDir, circleOrigin);
// 圆心到直线的距离
float dist = (CloestPoint - circleOrigin).Size();
if(dist > radius)
{
// 距离大于圆的半径,没有交点
}
else if(dist == radius)
{
// 距离等于半径,交点就是最近的点
IntersectionPoints.Add(ClosestPoint);
}
else
{
// 距离小于半径,交点有2个
// 斜边边长 = 半径, 一条直角边长 = 圆心到直线的距离
float HypotenuseLength = FMath::Sqrt(radius * radius - dist * dist);
FVector Point1 = ClosestPoint + LineDir * HypotenuseLength;
IntersectionPoints.Add(Point1);
FVector Point2 = ClosestPoint - LineDir * HypotenuseLength;
IntersectionPoints.Add(Point2);
}
return IntersectionPoints;
}
为什么没有代码格式的排版……