# Geometry
# 说明
Geometry 命名空间提供了一系列几何计算和图形处理的函数和类,用于在游戏中进行空间位置、形状计算和碰撞检测等操作。
# 如何使用
// 角度和弧度转换
float degrees = Geometry::RadianToDegree(M_PI / 4); // 45度
float radians = Geometry::ToRadians(45.0f); // π/4
// 几何计算
std::vector<Vector> path = unit->Path();
float pathLength = Geometry::PathLength(path);
// 使用几何图形
Geometry::Circle circle(Vector(500, 500), 150.0f);
Geometry::Polygon polygon;
circle.ToPolygon(polygon);
polygon.Draw(MAKE_COLOR(255, 0, 0, 255), 2.0f);
# 常量
# CIRCLE_LINE_SEGMENTS
#define CIRCLE_LINE_SEGMENTS 18
圆形转多边形时使用的线段数量,决定了多边形近似圆形的精度。
// 内部使用,不需要直接调用
// 当Circle::ToPolygon()调用时,会使用这个常量来确定多边形的顶点数
# Vector静态成员
# Vector.Zero
static Vector Zero
表示坐标为(0,0,0)的零向量。用于需要默认向量或者零向量的场景。
// 使用零向量作为默认值
bool isValidTarget = hero->IsValidTarget(900.0f, true, Vector::Zero);
// 作为参考点
Vector direction = (targetPos - Vector::Zero).Normalized();
# RadianToDegree
double RadianToDegree(double angle)
将弧度转换为角度。
参数名字 | 参数类型 | 描述 |
---|---|---|
angle | double | 要转换的弧度值 |
double radians = M_PI / 4; // 45度的弧度
float degrees = Geometry::RadianToDegree(radians);
// degrees ≈ 45.0
# ToRadians
float ToRadians(float val)
将角度转换为弧度。
参数名字 | 参数类型 | 描述 |
---|---|---|
val | float | 要转换的角度值 |
float degrees = 45.0f;
float radians = Geometry::ToRadians(degrees);
// radians ≈ 0.785398... (π/4)
# CircleCircleIntersection
void CircleCircleIntersection(const Vector& center1, const Vector& center2, float radius1, float radius2, std::vector<Vector>& Out)
计算两个圆的交点。
参数名字 | 参数类型 | 描述 |
---|---|---|
center1 | const Vector& | 第一个圆的中心点 |
center2 | const Vector& | 第二个圆的中心点 |
radius1 | float | 第一个圆的半径 |
radius2 | float | 第二个圆的半径 |
Out | std::vector<Vector>& | 输出参数,用于存储交点 |
Vector center1(100, 100);
Vector center2(150, 100);
float radius1 = 60;
float radius2 = 60;
std::vector<Vector> intersectionPoints;
Geometry::CircleCircleIntersection(center1, center2, radius1, radius2, intersectionPoints);
// intersectionPoints 包含了两个圆的交点
# ClipPolygons
std::vector<std::vector<ClipperLib::IntPoint>> ClipPolygons(std::vector<Polygon>& polygons)
剪裁多边形集合。
参数名字 | 参数类型 | 描述 |
---|---|---|
polygons | std::vector<Polygon>& | 要剪裁的多边形集合 |
std::vector<Geometry::Polygon> polygons;
// 添加多边形到集合
auto clippedPolygons = Geometry::ClipPolygons(polygons);
# PositionAfter
Vector PositionAfter(const std::vector<Vector>& self, int t, int speed, int delay = 0)
计算物体在给定时间、速度和延迟后的位置。
参数名字 | 参数类型 | 描述 |
---|---|---|
self | const std::vector<Vector>& | 路径点集合 |
t | int | 时间 |
speed | int | 移动速度 |
delay | int | 延迟时间,默认为0 |
std::vector<Vector> path = unit->Path();
Vector futurePosition = Geometry::PositionAfter(path, 500, unit->MoveSpeed());
# ToPolygon (ClipperLib::IntPoint 版本)
void ToPolygon(const std::vector<ClipperLib::IntPoint>& v, Polygon& out)
将 ClipperLib::IntPoint 向量转换为多边形。
参数名字 | 参数类型 | 描述 |
---|---|---|
v | const std::vector<ClipperLib::IntPoint>& | 点集合 |
out | Polygon& | 输出参数,转换后的多边形 |
std::vector<ClipperLib::IntPoint> points;
// 添加点到集合
Geometry::Polygon polygon;
Geometry::ToPolygon(points, polygon);
# ToPolygon (嵌套 ClipperLib::IntPoint 版本)
void ToPolygon(const std::vector<std::vector<ClipperLib::IntPoint>>& v, std::vector<Polygon>& out)
将嵌套的 ClipperLib::IntPoint 向量转换为多边形集合。
参数名字 | 参数类型 | 描述 |
---|---|---|
v | const std::vector<std::vector<ClipperLib::IntPoint>>& | 嵌套点集合 |
out | std::vector<Polygon>& | 输出参数,转换后的多边形集合 |
std::vector<std::vector<ClipperLib::IntPoint>> nestedPoints;
// 添加点集合到嵌套集合
std::vector<Geometry::Polygon> polygons;
Geometry::ToPolygon(nestedPoints, polygons);
# VectorMovementCollision
void VectorMovementCollision(const Vector& startPoint1, const Vector& endPoint1, float v1, const Vector& startPoint2, float v2, float delay, float& Outt, Vector& Outpos)
计算向量移动碰撞。
参数名字 | 参数类型 | 描述 |
---|---|---|
startPoint1 | const Vector& | 第一个物体的起始位置 |
endPoint1 | const Vector& | 第一个物体的结束位置 |
v1 | float | 第一个物体的速度 |
startPoint2 | const Vector& | 第二个物体的起始位置 |
v2 | float | 第二个物体的速度 |
delay | float | 延迟时间 |
Outt | float& | 输出参数,碰撞时间 |
Outpos | Vector& | 输出参数,碰撞位置 |
Vector startPoint1 = hero->Position();
Vector endPoint1 = hero->Position().Extend(hero->Direction(), 1000);
float v1 = hero->MoveSpeed();
Vector startPoint2 = missile->StartPosition();
float v2 = missile->SData()->MissileSpeed();
float delay = 0.25f;
float collisionTime;
Vector collisionPosition;
Geometry::VectorMovementCollision(startPoint1, endPoint1, v1, startPoint2, v2, delay, collisionTime, collisionPosition);
// 如果collisionTime不是NaN,则表示会碰撞,collisionPosition是碰撞位置
# PathLength
float PathLength(const std::vector<Vector>& path)
计算路径长度。
参数名字 | 参数类型 | 描述 |
---|---|---|
path | const std::vector<Vector>& | 路径点集合 |
std::vector<Vector> path = unit->Path();
float length = Geometry::PathLength(path);
# CutPath
void CutPath(const std::vector<Vector>& path, float distance, std::vector<Vector>& out)
按指定距离切割路径。
参数名字 | 参数类型 | 描述 |
---|---|---|
path | const std::vector<Vector>& | 要切割的路径点集合 |
distance | float | 切割距离 |
out | std::vector<Vector>& | 输出参数,切割后的路径点集合 |
std::vector<Vector> path = unit->Path();
std::vector<Vector> cutResult;
Geometry::CutPath(path, 500, cutResult);
// cutResult包含从路径起点到指定距离的路径段
# 类:Polygon
表示一个多边形。
Geometry::Polygon polygon;
polygon.Add(Vector(100, 100));
polygon.Add(Vector(200, 100));
polygon.Add(Vector(200, 200));
polygon.Add(Vector(100, 200));
# Polygon.Polygon
Polygon()
创建一个空的多边形。
Geometry::Polygon polygon;
# Polygon.Add
void Add(const Vector& point)
向多边形添加一个点。
参数名字 | 参数类型 | 描述 |
---|---|---|
point | const Vector& | 要添加的点 |
Geometry::Polygon polygon;
polygon.Add(Vector(100, 100));
polygon.Add(Vector(200, 100));
polygon.Add(Vector(200, 200));
polygon.Add(Vector(100, 200));
# Polygon.IsInside
bool IsInside(const Vector& point) const
检查点是否在多边形内部。
参数名字 | 参数类型 | 描述 |
---|---|---|
point | const Vector& | 要检查的点 |
Geometry::Polygon polygon;
// 添加点构成多边形
Vector point(150, 150);
bool isInside = polygon.IsInside(point);
# Polygon.Draw
void Draw(unsigned int color, int width = 1, float z = -1.0f) const
绘制多边形。
参数名字 | 参数类型 | 描述 |
---|---|---|
color | unsigned int | 绘制颜色 |
width | int | 线宽,默认为1 |
z | float | z坐标,默认为-1.0f |
Geometry::Polygon polygon;
// 添加点构成多边形
polygon.Draw(MAKE_COLOR(255, 0, 0, 255), 2.0f);
# Polygon.ToClipperPath
void ToClipperPath(std::vector<ClipperLib::IntPoint>& out) const
将多边形转换为ClipperLib路径。
参数名字 | 参数类型 | 描述 |
---|---|---|
out | std::vector<ClipperLib::IntPoint>& | 输出参数,转换后的路径点集合 |
Geometry::Polygon polygon;
// 添加点构成多边形
std::vector<ClipperLib::IntPoint> clipperPath;
polygon.ToClipperPath(clipperPath);
# 类:Circle
表示一个圆。
Vector center(500, 500);
float radius = 150.0f;
Geometry::Circle circle(center, radius);
# Circle.Circle
Circle()
创建一个默认的圆,中心在(0,0),半径为0。
Geometry::Circle defaultCircle;
# Circle.Circle
Circle(const Vector& center, float radius)
创建一个具有指定中心和半径的圆。
参数名字 | 参数类型 | 描述 |
---|---|---|
center | const Vector& | 圆心位置 |
radius | float | 圆的半径 |
Vector center(500, 500);
float radius = 150.0f;
Geometry::Circle circle(center, radius);
# Circle.ToPolygon
void ToPolygon(Polygon& out, int extraRadius = 0, float overrideRadius = -1) const
将圆转换为多边形近似表示。
参数名字 | 参数类型 | 描述 |
---|---|---|
out | Polygon& | 输出参数,转换后的多边形 |
extraRadius | int | 额外添加的半径,默认为0 |
overrideRadius | float | 覆盖现有半径的值,默认为-1(不覆盖) |
Geometry::Circle circle(Vector(500, 500), 150.0f);
Geometry::Polygon polygon;
circle.ToPolygon(polygon);
// 现在polygon包含了一个近似表示circle的多边形
# 类:Arc
表示一个弧。
Vector start(100, 100);
Vector end(300, 100);
int radius = 100;
Geometry::Arc arc(start, end, radius);
# Arc.Arc
Arc()
创建一个默认的弧。
Geometry::Arc defaultArc;
# Arc.Arc
Arc(const Vector& start, const Vector& end, int radius)
创建一个具有指定起始点、结束点和半径的弧。
参数名字 | 参数类型 | 描述 |
---|---|---|
start | const Vector& | 弧的起始位置 |
end | const Vector& | 弧的结束位置 |
radius | int | 弧的半径 |
Vector start(100, 100);
Vector end(300, 100);
int radius = 100;
Geometry::Arc arc(start, end, radius);
# Arc.ToPolygon
void ToPolygon(Polygon& out, int offset = 0) const
将弧转换为多边形近似表示。
参数名字 | 参数类型 | 描述 |
---|---|---|
out | Polygon& | 输出参数,转换后的多边形 |
offset | int | 偏移量,默认为0 |
Geometry::Arc arc(Vector(100, 100), Vector(300, 100), 100);
Geometry::Polygon polygon;
arc.ToPolygon(polygon);
// 现在polygon包含了一个近似表示arc的多边形
# 类:Rectangle
表示一个矩形。
Vector start(100, 100);
Vector end(400, 100);
float width = 50.0f;
Geometry::Rectangle rectangle(start, end, width);
# Rectangle.Rectangle
Rectangle()
创建一个默认的矩形。
Geometry::Rectangle defaultRectangle;
# Rectangle.Rectangle
Rectangle(const Vector& start, const Vector& end, float width)
创建一个具有指定起始点、结束点和宽度的矩形。
参数名字 | 参数类型 | 描述 |
---|---|---|
start | const Vector& | 矩形的起始位置 |
end | const Vector& | 矩形的结束位置 |
width | float | 矩形的宽度 |
Vector start(100, 100);
Vector end(400, 100);
float width = 50.0f;
Geometry::Rectangle rectangle(start, end, width);
# Rectangle.ToPolygon
void ToPolygon(Polygon& out, int offset = 0) const
将矩形转换为多边形表示。
参数名字 | 参数类型 | 描述 |
---|---|---|
out | Polygon& | 输出参数,转换后的多边形 |
offset | int | 偏移量,默认为0 |
Geometry::Rectangle rectangle(Vector(100, 100), Vector(400, 100), 50.0f);
Geometry::Polygon polygon;
rectangle.ToPolygon(polygon);
// 现在polygon表示了rectangle
# 类:Ring
表示一个环形(两个同心圆之间的区域)。
Vector center(300, 300);
float innerRadius = 100.0f;
float outerRadius = 200.0f;
Geometry::Ring ring(center, innerRadius, outerRadius);
# Ring.Ring
Ring()
创建一个默认的环。
Geometry::Ring defaultRing;
# Ring.Ring
Ring(const Vector& center, float innerRadius, float outerRadius)
创建一个具有指定中心、内半径和外半径的环。
参数名字 | 参数类型 | 描述 |
---|---|---|
center | const Vector& | 环的中心位置 |
innerRadius | float | 内圆半径 |
outerRadius | float | 外圆半径 |
Vector center(300, 300);
float innerRadius = 100.0f;
float outerRadius = 200.0f;
Geometry::Ring ring(center, innerRadius, outerRadius);
# Ring.ToPolygon
void ToPolygon(Polygon& out, int offset = 0) const
将环转换为多边形表示。
参数名字 | 参数类型 | 描述 |
---|---|---|
out | Polygon& | 输出参数,转换后的多边形 |
offset | int | 偏移量,默认为0 |
Geometry::Ring ring(Vector(300, 300), 100.0f, 200.0f);
Geometry::Polygon polygon;
ring.ToPolygon(polygon);
// 现在polygon表示了ring
# 类:Cone
表示一个锥形区域。
Vector center = hero->Position();
Vector direction = (enemy->Position() - center).Normalized();
float radius = 45.0f; // 45度的锥形
float range = 600.0f; // 600单位的范围
Geometry::Cone cone(center, direction, radius, range);
# Cone.Cone
Cone()
创建一个默认的锥。
Geometry::Cone defaultCone;
# Cone.Cone
Cone(const Vector& center, const Vector& direction, float radius, float range)
创建一个具有指定中心、方向、半径和范围的锥。
参数名字 | 参数类型 | 描述 |
---|---|---|
center | const Vector& | 锥的中心位置 |
direction | const Vector& | 锥的方向向量 |
radius | float | 锥的角度半径(度) |
range | float | 锥的范围 |
Vector center = hero->Position();
Vector direction = (enemy->Position() - center).Normalized();
float radius = 45.0f; // 45度的锥形
float range = 600.0f; // 600单位的范围
Geometry::Cone cone(center, direction, radius, range);
# Cone.ToPolygon
void ToPolygon(Polygon& out, int offset = 0) const
将锥转换为多边形表示。
参数名字 | 参数类型 | 描述 |
---|---|---|
out | Polygon& | 输出参数,转换后的多边形 |
offset | int | 偏移量,默认为0 |
Geometry::Cone cone(center, direction, 45.0f, 600.0f);
Geometry::Polygon polygon;
cone.ToPolygon(polygon);
// 现在polygon表示了cone
← Game HealthPrediction →