Searching...
No Matches
trigo.cpp File Reference

Trigonometric and geometric basic functions. More...

`#include <limits>`
`#include <stdlib.h>`
`#include <type_traits>`
`#include <geometry/seg.h>`
`#include <math/util.h>`
`#include <math/vector2d.h>`
`#include <trigo.h>`

Go to the source code of this file.

## Functions

bool IsPointOnSegment (const VECTOR2I &aSegStart, const VECTOR2I &aSegEnd, const VECTOR2I &aTestPoint)
Test if aTestPoint is on line defined by aSegStart and aSegEnd.

bool SegmentIntersectsSegment (const VECTOR2I &a_p1_l1, const VECTOR2I &a_p2_l1, const VECTOR2I &a_p1_l2, const VECTOR2I &a_p2_l2, VECTOR2I *aIntersectionPoint)
Test if two lines intersect.

bool TestSegmentHit (const VECTOR2I &aRefPoint, const VECTOR2I &aStart, const VECTOR2I &aEnd, int aDist)
Test if aRefPoint is with aDistance on the line defined by aStart and aEnd.

const VECTOR2I CalcArcMid (const VECTOR2I &aStart, const VECTOR2I &aEnd, const VECTOR2I &aCenter, bool aMinArcAngle)
Return the middle point of an arc, half-way between aStart and aEnd.

void RotatePoint (int *pX, int *pY, const EDA_ANGLE &aAngle)
Calculate the new point of coord coord pX, pY, for a rotation center 0, 0.

void RotatePoint (int *pX, int *pY, int cx, int cy, const EDA_ANGLE &angle)
Calculate the new point of coord coord pX, pY, for a rotation center cx, cy.

void RotatePoint (double *pX, double *pY, double cx, double cy, const EDA_ANGLE &angle)

void RotatePoint (double *pX, double *pY, const EDA_ANGLE &aAngle)
Calculate the new coord point point for a rotation center 0, 0.

const VECTOR2D CalcArcCenter (const VECTOR2D &aStart, const VECTOR2D &aEnd, const EDA_ANGLE &aAngle)

const VECTOR2D CalcArcCenter (const VECTOR2D &aStart, const VECTOR2D &aMid, const VECTOR2D &aEnd)

const VECTOR2I CalcArcCenter (const VECTOR2I &aStart, const VECTOR2I &aMid, const VECTOR2I &aEnd)
Determine the center of an arc or circle given three points on its circumference.

bool TestSegmentHitFast (const VECTOR2I &aRefPoint, const VECTOR2I &aStart, const VECTOR2I &aEnd, int aDist)
Test if a point hits a line segment within a given distance.

## Detailed Description

Trigonometric and geometric basic functions.

Definition in file trigo.cpp.

## ◆ CalcArcCenter() [1/3]

 const VECTOR2D CalcArcCenter ( const VECTOR2D & aStart, const VECTOR2D & aEnd, const EDA_ANGLE & aAngle )

Definition at line 332 of file trigo.cpp.

References ANGLE_0, ANGLE_180, ANGLE_360, ANGLE_90, EuclideanNorm(), VECTOR2< T >::Resize(), and RotatePoint().

Referenced by CalcArcCenter().

## ◆ CalcArcCenter() [2/3]

 const VECTOR2D CalcArcCenter ( const VECTOR2D & aStart, const VECTOR2D & aMid, const VECTOR2D & aEnd )

Definition at line 368 of file trigo.cpp.

References std::abs(), VECTOR2< T >::EuclideanNorm(), VECTOR2< T >::x, and VECTOR2< T >::y.

## ◆ CalcArcCenter() [3/3]

 const VECTOR2I CalcArcCenter ( const VECTOR2I & aStart, const VECTOR2I & aMid, const VECTOR2I & aEnd )

Determine the center of an arc or circle given three points on its circumference.

Parameters
 aStart The starting point of the circle (equivalent to aEnd). aMid The point on the arc, half-way between aStart and aEnd. aEnd The ending point of the circle (equivalent to aStart).
Returns
The center of the circle.

Definition at line 520 of file trigo.cpp.

References CalcArcCenter(), KiROUND(), VECTOR2< T >::x, and VECTOR2< T >::y.

## ◆ CalcArcMid()

 const VECTOR2I CalcArcMid ( const VECTOR2I & aStart, const VECTOR2I & aEnd, const VECTOR2I & aCenter, bool aMinArcAngle = `true` )

Return the middle point of an arc, half-way between aStart and aEnd.

There are two possible solutions which can be found by toggling aMinArcAngle. The behavior is undefined for semicircles (i.e. 180 degree arcs).

Parameters
 aStart The starting point of the arc (for calculating the radius). aEnd The end point of the arc (for determining the arc angle). aCenter The center point of the arc. aMinArcAngle If true, returns the point that results in the smallest arc angle.
Returns
The middle point of the arc.

Definition at line 208 of file trigo.cpp.

References ANGLE_180, and RotatePoint().

## ◆ IsPointOnSegment()

 bool IsPointOnSegment ( const VECTOR2I & aSegStart, const VECTOR2I & aSegEnd, const VECTOR2I & aTestPoint )

Test if aTestPoint is on line defined by aSegStart and aSegEnd.

This function is faster than TestSegmentHit() because aTestPoint should be exactly on the line. This only works for horizontal, vertical, and 45 degree line segments.

Parameters
 aSegStart The first point of the line segment. aSegEnd The second point of the line segment. aTestPoint The point to test.
Returns
true if the point is on the line segment.

Definition at line 88 of file trigo.cpp.

References VECTOR2< T >::x, and VECTOR2< T >::y.

## ◆ RotatePoint() [1/4]

 void RotatePoint ( double * pX, double * pY, const EDA_ANGLE & aAngle )

Calculate the new coord point point for a rotation center 0, 0.

Definition at line 294 of file trigo.cpp.

## ◆ RotatePoint() [2/4]

 void RotatePoint ( double * pX, double * pY, double cx, double cy, const EDA_ANGLE & angle )

Definition at line 280 of file trigo.cpp.

References RotatePoint().

## ◆ RotatePoint() [4/4]

 void RotatePoint ( int * pX, int * pY, int cx, int cy, const EDA_ANGLE & angle )

Calculate the new point of coord coord pX, pY, for a rotation center cx, cy.

Definition at line 266 of file trigo.cpp.

References RotatePoint().

## ◆ SegmentIntersectsSegment()

 bool SegmentIntersectsSegment ( const VECTOR2I & a_p1_l1, const VECTOR2I & a_p2_l1, const VECTOR2I & a_p1_l2, const VECTOR2I & a_p2_l2, VECTOR2I * aIntersectionPoint = `nullptr` )

Test if two lines intersect.

Parameters
 a_p1_l1 The first point of the first line. a_p2_l1 The second point of the first line. a_p1_l2 The first point of the second line. a_p2_l2 The second point of the second line. aIntersectionPoint is filled with the intersection point if it exists
Returns
bool true if the two segments defined by four points intersect. (i.e. if the 2 segments have at least a common point)

Definition at line 106 of file trigo.cpp.

References KiROUND(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by BOX2< Vec >::Intersects().

## ◆ TestSegmentHit()

 bool TestSegmentHit ( const VECTOR2I & aRefPoint, const VECTOR2I & aStart, const VECTOR2I & aEnd, int aDist )

Test if aRefPoint is with aDistance on the line defined by aStart and aEnd.

Parameters
 aRefPoint = reference point to test aStart is the first end-point of the line segment aEnd is the second end-point of the line segment aDist = maximum distance for hit

Definition at line 174 of file trigo.cpp.

References std::abs(), delta, SEG::Square(), SEG::SquaredDistance(), VECTOR2< T >::x, and VECTOR2< T >::y.

## ◆ TestSegmentHitFast()

 bool TestSegmentHitFast ( const VECTOR2I & aRefPoint, const VECTOR2I & aStart, const VECTOR2I & aEnd, int aDist )

Test if a point hits a line segment within a given distance.

This is a faster version of TestSegmentHit() that does not calculate the distance.

Definition at line 541 of file trigo.cpp.

References std::abs(), delta, EuclideanNorm(), ParallelogramArea(), VECTOR2< T >::x, and VECTOR2< T >::y.

Referenced by SHAPE_LINE_CHAIN::Simplify().