KiCad PCB EDA Suite
Loading...
Searching...
No Matches
geometry_utils.cpp File Reference

a few functions useful in geometry calculations. More...

#include <cstdint>
#include <algorithm>
#include <geometry/geometry_utils.h>
#include <math/util.h>

Go to the source code of this file.

Macros

#define MIN_SEGCOUNT_FOR_CIRCLE   8
 

Functions

int GetArcToSegmentCount (int aRadius, int aErrorMax, const EDA_ANGLE &aArcAngle)
 
int CircleToEndSegmentDeltaRadius (int aRadius, int aSegCount)
 
int GetCircleToPolyCorrection (int aMaxError)
 
int clipOutCode (const BOX2I *aClipBox, int x, int y)
 
bool ClipLine (const BOX2I *aClipBox, int &x1, int &y1, int &x2, int &y2)
 Test if any part of a line falls within the bounds of a rectangle.
 

Variables

static bool s_disable_arc_correction = false
 

Detailed Description

a few functions useful in geometry calculations.

Definition in file geometry_utils.cpp.

Macro Definition Documentation

◆ MIN_SEGCOUNT_FOR_CIRCLE

#define MIN_SEGCOUNT_FOR_CIRCLE   8

Definition at line 40 of file geometry_utils.cpp.

Function Documentation

◆ CircleToEndSegmentDeltaRadius()

int CircleToEndSegmentDeltaRadius ( int  aInnerCircleRadius,
int  aSegCount 
)
Returns
the radius diffence of the circle defined by segments inside the circle and the radius of the circle tangent to the middle of segments (defined by segments outside this circle)
Parameters
aInnerCircleRadiusis the radius of the circle tangent to the middle of segments
aSegCountis the seg count to approximate the circle

Definition at line 67 of file geometry_utils.cpp.

References std::abs(), delta, and KiROUND().

Referenced by ConvertArcToPolyline(), SHAPE_ARC::ConvertToPolyline(), CornerListToPolygon(), TransformCircleToPolygon(), and TransformOvalToPolygon().

◆ ClipLine()

bool ClipLine ( const BOX2I aClipBox,
int &  x1,
int &  y1,
int &  x2,
int &  y2 
)

Test if any part of a line falls within the bounds of a rectangle.

Please note that this is only accurate for lines that are one pixel wide.

Parameters
aClipBox- The rectangle to test.
x1- X coordinate of one end of a line.
y1- Y coordinate of one end of a line.
x2- X coordinate of the other end of a line.
y2- Y coordinate of the other end of a line.
Returns
- False if any part of the line lies within the rectangle.

Definition at line 137 of file geometry_utils.cpp.

References clipOutCode(), BOX2< Vec >::GetBottom(), BOX2< Vec >::GetRight(), BOX2< Vec >::GetX(), and BOX2< Vec >::GetY().

Referenced by KIGFX::DrawDashedLine(), STROKE_PARAMS::Stroke(), KIGFX::ORIGIN_VIEWITEM::ViewDraw(), and PCB_TRACK::ViewGetLOD().

◆ clipOutCode()

int clipOutCode ( const BOX2I aClipBox,
int  x,
int  y 
)
inline

Definition at line 117 of file geometry_utils.cpp.

References BOX2< Vec >::GetBottom(), and BOX2< Vec >::GetRight().

Referenced by ClipLine().

◆ GetArcToSegmentCount()

int GetArcToSegmentCount ( int  aRadius,
int  aErrorMax,
const EDA_ANGLE aArcAngle 
)

◆ GetCircleToPolyCorrection()

int GetCircleToPolyCorrection ( int  aMaxError)
Returns
the radius correction to approximate a circle.
Parameters
aMaxErroris the same error value used to calculate the number of segments.

When creating a polygon from a circle, the polygon is inside the circle. Only corners are on the circle. This is incorrect when building clearance areas of circles, that need to build the equivalent polygon outside the circle.

Definition at line 106 of file geometry_utils.cpp.

References s_disable_arc_correction.

Referenced by CornerListToPolygon(), TransformCircleToPolygon(), and TransformOvalToPolygon().

Variable Documentation

◆ s_disable_arc_correction