# 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