v0.14.0
Public Member Functions | Public Attributes | Private Member Functions | Private Attributes | List of all members
ClipperLib::ClipperOffset Class Reference

#include <users_modules/mortar_contact/src/clipper.hpp>

Collaboration diagram for ClipperLib::ClipperOffset:
[legend]

Public Member Functions

 ClipperOffset (double miterLimit=2.0, double roundPrecision=0.25)
 
 ~ClipperOffset ()
 
void AddPath (const Path &path, JoinType joinType, EndType endType)
 
void AddPaths (const Paths &paths, JoinType joinType, EndType endType)
 
void Execute (Paths &solution, double delta)
 
void Execute (PolyTree &solution, double delta)
 
void Clear ()
 

Public Attributes

double MiterLimit
 
double ArcTolerance
 

Private Member Functions

void FixOrientations ()
 
void DoOffset (double delta)
 
void OffsetPoint (int j, int &k, JoinType jointype)
 
void DoSquare (int j, int k)
 
void DoMiter (int j, int k, double r)
 
void DoRound (int j, int k)
 

Private Attributes

Paths m_destPolys
 
Path m_srcPoly
 
Path m_destPoly
 
std::vector< DoublePointm_normals
 
double m_delta
 
double m_sinA
 
double m_sin
 
double m_cos
 
double m_miterLim
 
double m_StepsPerRad
 
IntPoint m_lowest
 
PolyNode m_polyNodes
 

Detailed Description

Definition at line 358 of file clipper.hpp.

Constructor & Destructor Documentation

◆ ClipperOffset()

ClipperLib::ClipperOffset::ClipperOffset ( double  miterLimit = 2.0,
double  roundPrecision = 0.25 
)

Definition at line 3815 of file clipper.cpp.

3818  {
3819  j++;
3820  newNode->Contour.push_back(path[i]);

◆ ~ClipperOffset()

ClipperLib::ClipperOffset::~ClipperOffset ( )

Definition at line 3823 of file clipper.cpp.

3826  {

Member Function Documentation

◆ AddPath()

void ClipperLib::ClipperOffset::AddPath ( const Path path,
JoinType  joinType,
EndType  endType 
)

Definition at line 3838 of file clipper.cpp.

3848 {
3849  for (Paths::size_type i = 0; i < paths.size(); ++i)
3850  AddPath(paths[i], joinType, endType);
3851 }
3852 //------------------------------------------------------------------------------
3853 
3855 {
3856  //fixup orientations of all closed paths if the orientation of the
3857  //closed path with the lowermost vertex is wrong ...
3858  if (m_lowest.X >= 0 &&
3859  !Orientation(m_polyNodes.Childs[(int)m_lowest.X]->Contour))
3860  {
3861  for (int i = 0; i < m_polyNodes.ChildCount(); ++i)
3862  {
3863  PolyNode& node = *m_polyNodes.Childs[i];
3864  if (node.m_endtype == etClosedPolygon ||
3865  (node.m_endtype == etClosedLine && Orientation(node.Contour)))
3866  ReversePath(node.Contour);
3867  }
3868  } else
3869  {
3870  for (int i = 0; i < m_polyNodes.ChildCount(); ++i)
3871  {
3872  PolyNode& node = *m_polyNodes.Childs[i];
3873  if (node.m_endtype == etClosedLine && !Orientation(node.Contour))
3874  ReversePath(node.Contour);
3875  }
3876  }
3877 }
3878 //------------------------------------------------------------------------------
3879 
3880 void ClipperOffset::Execute(Paths& solution, double delta)

◆ AddPaths()

void ClipperLib::ClipperOffset::AddPaths ( const Paths paths,
JoinType  joinType,
EndType  endType 
)

Definition at line 3883 of file clipper.cpp.

3890  {

◆ Clear()

void ClipperLib::ClipperOffset::Clear ( )

Definition at line 3829 of file clipper.cpp.

3837  {

◆ DoMiter()

void ClipperLib::ClipperOffset::DoMiter ( int  j,
int  k,
double  r 
)
private

Definition at line 4217 of file clipper.cpp.

4218  {
4219  OutRec* outrec = m_PolyOuts[i++];
4220  OutPt* op = outrec->Pts;
4221  if (!op || outrec->IsOpen) continue;
4222  do //for each Pt in Polygon until duplicate found do ...

◆ DoOffset()

void ClipperLib::ClipperOffset::DoOffset ( double  delta)
private

Definition at line 3987 of file clipper.cpp.

3989  {
3990  PolyNode& node = *m_polyNodes.Childs[i];
3991  m_srcPoly = node.Contour;
3992 
3993  int len = (int)m_srcPoly.size();
3994  if (len == 0 || (delta <= 0 && (len < 3 || node.m_endtype != etClosedPolygon)))
3995  continue;
3996 
3997  m_destPoly.clear();
3998  if (len == 1)
3999  {
4000  if (node.m_jointype == jtRound)
4001  {
4002  double X = 1.0, Y = 0.0;
4003  for (cInt j = 1; j <= steps; j++)
4004  {
4005  m_destPoly.push_back(IntPoint(
4006  Round(m_srcPoly[0].X + X * delta),
4007  Round(m_srcPoly[0].Y + Y * delta)));
4008  double X2 = X;
4009  X = X * m_cos - m_sin * Y;
4010  Y = X2 * m_sin + Y * m_cos;
4011  }
4012  }
4013  else
4014  {
4015  double X = -1.0, Y = -1.0;
4016  for (int j = 0; j < 4; ++j)
4017  {
4018  m_destPoly.push_back(IntPoint(
4019  Round(m_srcPoly[0].X + X * delta),
4020  Round(m_srcPoly[0].Y + Y * delta)));
4021  if (X < 0) X = 1;
4022  else if (Y < 0) Y = 1;
4023  else X = -1;
4024  }
4025  }
4026  m_destPolys.push_back(m_destPoly);
4027  continue;
4028  }
4029  //build m_normals ...
4030  m_normals.clear();
4031  m_normals.reserve(len);
4032  for (int j = 0; j < len - 1; ++j)
4033  m_normals.push_back(GetUnitNormal(m_srcPoly[j], m_srcPoly[j + 1]));
4034  if (node.m_endtype == etClosedLine || node.m_endtype == etClosedPolygon)
4035  m_normals.push_back(GetUnitNormal(m_srcPoly[len - 1], m_srcPoly[0]));
4036  else
4037  m_normals.push_back(DoublePoint(m_normals[len - 2]));
4038 
4039  if (node.m_endtype == etClosedPolygon)
4040  {
4041  int k = len - 1;
4042  for (int j = 0; j < len; ++j)
4043  OffsetPoint(j, k, node.m_jointype);
4044  m_destPolys.push_back(m_destPoly);
4045  }
4046  else if (node.m_endtype == etClosedLine)
4047  {
4048  int k = len - 1;
4049  for (int j = 0; j < len; ++j)
4050  OffsetPoint(j, k, node.m_jointype);
4051  m_destPolys.push_back(m_destPoly);
4052  m_destPoly.clear();
4053  //re-build m_normals ...
4054  DoublePoint n = m_normals[len -1];
4055  for (int j = len - 1; j > 0; j--)
4056  m_normals[j] = DoublePoint(-m_normals[j - 1].X, -m_normals[j - 1].Y);
4057  m_normals[0] = DoublePoint(-n.X, -n.Y);
4058  k = 0;
4059  for (int j = len - 1; j >= 0; j--)
4060  OffsetPoint(j, k, node.m_jointype);
4061  m_destPolys.push_back(m_destPoly);
4062  }
4063  else
4064  {
4065  int k = 0;
4066  for (int j = 1; j < len - 1; ++j)
4067  OffsetPoint(j, k, node.m_jointype);
4068 
4069  IntPoint pt1;
4070  if (node.m_endtype == etOpenButt)
4071  {
4072  int j = len - 1;
4073  pt1 = IntPoint((cInt)Round(m_srcPoly[j].X + m_normals[j].X *
4074  delta), (cInt)Round(m_srcPoly[j].Y + m_normals[j].Y * delta));
4075  m_destPoly.push_back(pt1);
4076  pt1 = IntPoint((cInt)Round(m_srcPoly[j].X - m_normals[j].X *
4077  delta), (cInt)Round(m_srcPoly[j].Y - m_normals[j].Y * delta));
4078  m_destPoly.push_back(pt1);
4079  }
4080  else
4081  {
4082  int j = len - 1;
4083  k = len - 2;
4084  m_sinA = 0;
4085  m_normals[j] = DoublePoint(-m_normals[j].X, -m_normals[j].Y);
4086  if (node.m_endtype == etOpenSquare)
4087  DoSquare(j, k);
4088  else
4089  DoRound(j, k);
4090  }
4091 
4092  //re-build m_normals ...
4093  for (int j = len - 1; j > 0; j--)
4094  m_normals[j] = DoublePoint(-m_normals[j - 1].X, -m_normals[j - 1].Y);
4095  m_normals[0] = DoublePoint(-m_normals[1].X, -m_normals[1].Y);
4096 
4097  k = len - 1;
4098  for (int j = k - 1; j > 0; --j) OffsetPoint(j, k, node.m_jointype);
4099 
4100  if (node.m_endtype == etOpenButt)
4101  {
4102  pt1 = IntPoint((cInt)Round(m_srcPoly[0].X - m_normals[0].X * delta),
4103  (cInt)Round(m_srcPoly[0].Y - m_normals[0].Y * delta));
4104  m_destPoly.push_back(pt1);
4105  pt1 = IntPoint((cInt)Round(m_srcPoly[0].X + m_normals[0].X * delta),
4106  (cInt)Round(m_srcPoly[0].Y + m_normals[0].Y * delta));
4107  m_destPoly.push_back(pt1);
4108  }
4109  else
4110  {
4111  k = 1;
4112  m_sinA = 0;
4113  if (node.m_endtype == etOpenSquare)
4114  DoSquare(0, 1);
4115  else
4116  DoRound(0, 1);
4117  }
4118  m_destPolys.push_back(m_destPoly);
4119  }
4120  }
4121 }
4122 //------------------------------------------------------------------------------
4123 
4124 void ClipperOffset::OffsetPoint(int j, int& k, JoinType jointype)
4125 {
4126  //cross product ...
4127  m_sinA = (m_normals[k].X * m_normals[j].Y - m_normals[j].X * m_normals[k].Y);
4128  if (std::fabs(m_sinA * m_delta) < 1.0)
4129  {
4130  //dot product ...
4131  double cosA = (m_normals[k].X * m_normals[j].X + m_normals[j].Y * m_normals[k].Y );
4132  if (cosA > 0) // angle => 0 degrees
4133  {
4134  m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + m_normals[k].X * m_delta),
4135  Round(m_srcPoly[j].Y + m_normals[k].Y * m_delta)));
4136  return;
4137  }
4138  //else angle => 180 degrees
4139  }
4140  else if (m_sinA > 1.0) m_sinA = 1.0;
4141  else if (m_sinA < -1.0) m_sinA = -1.0;
4142 
4143  if (m_sinA * m_delta < 0)
4144  {
4145  m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + m_normals[k].X * m_delta),
4146  Round(m_srcPoly[j].Y + m_normals[k].Y * m_delta)));
4147  m_destPoly.push_back(m_srcPoly[j]);
4148  m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + m_normals[j].X * m_delta),
4149  Round(m_srcPoly[j].Y + m_normals[j].Y * m_delta)));
4150  }
4151  else
4152  switch (jointype)
4153  {
4154  case jtMiter:
4155  {
4156  double r = 1 + (m_normals[j].X * m_normals[k].X +
4157  m_normals[j].Y * m_normals[k].Y);

◆ DoRound()

void ClipperLib::ClipperOffset::DoRound ( int  j,
int  k 
)
private

Definition at line 4225 of file clipper.cpp.

4226  {
4227  if ((op->Pt == op2->Pt) && op2->Next != op && op2->Prev != op)
4228  {
4229  //split the polygon into two ...
4230  OutPt* op3 = op->Prev;
4231  OutPt* op4 = op2->Prev;
4232  op->Prev = op4;
4233  op4->Next = op;
4234  op2->Prev = op3;
4235  op3->Next = op2;
4236 
4237  outrec->Pts = op;
4238  OutRec* outrec2 = CreateOutRec();
4239  outrec2->Pts = op2;
4240  UpdateOutPtIdxs(*outrec2);
4241  if (Poly2ContainsPoly1(outrec2->Pts, outrec->Pts))
4242  {
4243  //OutRec2 is contained by OutRec1 ...
4244  outrec2->IsHole = !outrec->IsHole;

◆ DoSquare()

void ClipperLib::ClipperOffset::DoSquare ( int  j,
int  k 
)
private

Definition at line 4204 of file clipper.cpp.

4215 {

◆ Execute() [1/2]

void ClipperLib::ClipperOffset::Execute ( Paths solution,
double  delta 
)

Definition at line 3916 of file clipper.cpp.

3920  {
3921  clpr.Execute(ctUnion, solution, pftPositive, pftPositive);
3922  }
3923  else
3924  {
3925  IntRect r = clpr.GetBounds();
3926  Path outer(4);
3927  outer[0] = IntPoint(r.left - 10, r.bottom + 10);
3928  outer[1] = IntPoint(r.right + 10, r.bottom + 10);
3929  outer[2] = IntPoint(r.right + 10, r.top - 10);
3930  outer[3] = IntPoint(r.left - 10, r.top - 10);
3931 
3932  clpr.AddPath(outer, ptSubject, true);
3933  clpr.ReverseSolution(true);
3934  clpr.Execute(ctUnion, solution, pftNegative, pftNegative);
3935  //remove the outer PolyNode rectangle ...
3936  if (solution.ChildCount() == 1 && solution.Childs[0]->ChildCount() > 0)
3937  {
3938  PolyNode* outerNode = solution.Childs[0];
3939  solution.Childs.reserve(outerNode->ChildCount());
3940  solution.Childs[0] = outerNode->Childs[0];
3941  solution.Childs[0]->Parent = outerNode->Parent;
3942  for (int i = 1; i < outerNode->ChildCount(); ++i)
3943  solution.AddChild(*outerNode->Childs[i]);

◆ Execute() [2/2]

void ClipperLib::ClipperOffset::Execute ( PolyTree solution,
double  delta 
)

Definition at line 3946 of file clipper.cpp.

3952 {
3953  m_destPolys.clear();
3954  m_delta = delta;
3955 
3956  //if Zero offset, just copy any CLOSED polygons to m_p and return ...
3957  if (NEAR_ZERO(delta))
3958  {
3959  m_destPolys.reserve(m_polyNodes.ChildCount());
3960  for (int i = 0; i < m_polyNodes.ChildCount(); i++)
3961  {
3962  PolyNode& node = *m_polyNodes.Childs[i];
3963  if (node.m_endtype == etClosedPolygon)
3964  m_destPolys.push_back(node.Contour);
3965  }
3966  return;
3967  }
3968 
3969  //see offset_triginometry3.svg in the documentation folder ...
3970  if (MiterLimit > 2) m_miterLim = 2/(MiterLimit * MiterLimit);
3971  else m_miterLim = 0.5;
3972 
3973  double y;
3974  if (ArcTolerance <= 0.0) y = def_arc_tolerance;
3975  else if (ArcTolerance > std::fabs(delta) * def_arc_tolerance)
3976  y = std::fabs(delta) * def_arc_tolerance;
3977  else y = ArcTolerance;
3978  //see offset_triginometry2.svg in the documentation folder ...
3979  double steps = pi / std::acos(1 - y / std::fabs(delta));
3980  if (steps > std::fabs(delta) * pi)
3981  steps = std::fabs(delta) * pi; //ie excessive precision check
3982  m_sin = std::sin(two_pi / steps);
3983  m_cos = std::cos(two_pi / steps);
3984  m_StepsPerRad = steps / two_pi;

◆ FixOrientations()

void ClipperLib::ClipperOffset::FixOrientations ( )
private

Definition at line 3890 of file clipper.cpp.

3890  {
3891  clpr.Execute(ctUnion, solution, pftPositive, pftPositive);
3892  }
3893  else
3894  {
3895  IntRect r = clpr.GetBounds();
3896  Path outer(4);
3897  outer[0] = IntPoint(r.left - 10, r.bottom + 10);
3898  outer[1] = IntPoint(r.right + 10, r.bottom + 10);
3899  outer[2] = IntPoint(r.right + 10, r.top - 10);
3900  outer[3] = IntPoint(r.left - 10, r.top - 10);
3901 
3902  clpr.AddPath(outer, ptSubject, true);
3903  clpr.ReverseSolution(true);
3904  clpr.Execute(ctUnion, solution, pftNegative, pftNegative);
3905  if (solution.size() > 0) solution.erase(solution.begin());
3906  }
3907 }
3908 //------------------------------------------------------------------------------
3909 
3910 void ClipperOffset::Execute(PolyTree& solution, double delta)
3911 {
3912  solution.Clear();
3913  FixOrientations();

◆ OffsetPoint()

void ClipperLib::ClipperOffset::OffsetPoint ( int  j,
int &  k,
JoinType  jointype 
)
private

Definition at line 4160 of file clipper.cpp.

4161  : DoSquare(j, k); break;
4162  case jtRound: DoRound(j, k); break;
4163  }
4164  k = j;
4165 }
4166 //------------------------------------------------------------------------------
4167 
4168 void ClipperOffset::DoSquare(int j, int k)
4169 {
4170  double dx = std::tan(std::atan2(m_sinA,
4171  m_normals[k].X * m_normals[j].X + m_normals[k].Y * m_normals[j].Y) / 4);
4172  m_destPoly.push_back(IntPoint(
4173  Round(m_srcPoly[j].X + m_delta * (m_normals[k].X - m_normals[k].Y * dx)),
4174  Round(m_srcPoly[j].Y + m_delta * (m_normals[k].Y + m_normals[k].X * dx))));
4175  m_destPoly.push_back(IntPoint(
4176  Round(m_srcPoly[j].X + m_delta * (m_normals[j].X + m_normals[j].Y * dx)),
4177  Round(m_srcPoly[j].Y + m_delta * (m_normals[j].Y - m_normals[j].X * dx))));
4178 }
4179 //------------------------------------------------------------------------------
4180 
4181 void ClipperOffset::DoMiter(int j, int k, double r)
4182 {
4183  double q = m_delta / r;
4184  m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + (m_normals[k].X + m_normals[j].X) * q),
4185  Round(m_srcPoly[j].Y + (m_normals[k].Y + m_normals[j].Y) * q)));
4186 }
4187 //------------------------------------------------------------------------------
4188 
4189 void ClipperOffset::DoRound(int j, int k)
4190 {
4191  double a = std::atan2(m_sinA,
4192  m_normals[k].X * m_normals[j].X + m_normals[k].Y * m_normals[j].Y);
4193  int steps = std::max((int)Round(m_StepsPerRad * std::fabs(a)), 1);
4194 
4195  double X = m_normals[k].X, Y = m_normals[k].Y, X2;
4196  for (int i = 0; i < steps; ++i)
4197  {
4198  m_destPoly.push_back(IntPoint(
4199  Round(m_srcPoly[j].X + X * m_delta),
4200  Round(m_srcPoly[j].Y + Y * m_delta)));
4201  X2 = X;

Member Data Documentation

◆ ArcTolerance

double ClipperLib::ClipperOffset::ArcTolerance

Definition at line 369 of file clipper.hpp.

◆ m_cos

double ClipperLib::ClipperOffset::m_cos
private

Definition at line 375 of file clipper.hpp.

◆ m_delta

double ClipperLib::ClipperOffset::m_delta
private

Definition at line 375 of file clipper.hpp.

◆ m_destPoly

Path ClipperLib::ClipperOffset::m_destPoly
private

Definition at line 373 of file clipper.hpp.

◆ m_destPolys

Paths ClipperLib::ClipperOffset::m_destPolys
private

Definition at line 371 of file clipper.hpp.

◆ m_lowest

IntPoint ClipperLib::ClipperOffset::m_lowest
private

Definition at line 377 of file clipper.hpp.

◆ m_miterLim

double ClipperLib::ClipperOffset::m_miterLim
private

Definition at line 376 of file clipper.hpp.

◆ m_normals

std::vector<DoublePoint> ClipperLib::ClipperOffset::m_normals
private

Definition at line 374 of file clipper.hpp.

◆ m_polyNodes

PolyNode ClipperLib::ClipperOffset::m_polyNodes
private

Definition at line 378 of file clipper.hpp.

◆ m_sin

double ClipperLib::ClipperOffset::m_sin
private

Definition at line 375 of file clipper.hpp.

◆ m_sinA

double ClipperLib::ClipperOffset::m_sinA
private

Definition at line 375 of file clipper.hpp.

◆ m_srcPoly

Path ClipperLib::ClipperOffset::m_srcPoly
private

Definition at line 372 of file clipper.hpp.

◆ m_StepsPerRad

double ClipperLib::ClipperOffset::m_StepsPerRad
private

Definition at line 376 of file clipper.hpp.

◆ MiterLimit

double ClipperLib::ClipperOffset::MiterLimit

Definition at line 368 of file clipper.hpp.


The documentation for this class was generated from the following files:
ClipperLib::ClipperOffset::DoSquare
void DoSquare(int j, int k)
Definition: clipper.cpp:4204
ClipperLib::Path
std::vector< IntPoint > Path
Definition: clipper.hpp:106
ClipperLib::Paths
std::vector< Path > Paths
Definition: clipper.hpp:107
ClipperLib::ClipperOffset::m_miterLim
double m_miterLim
Definition: clipper.hpp:376
ClipperLib::ClipperOffset::m_lowest
IntPoint m_lowest
Definition: clipper.hpp:377
ClipperLib::ClipperOffset::m_polyNodes
PolyNode m_polyNodes
Definition: clipper.hpp:378
ClipperLib::PolyNode::Childs
PolyNodes Childs
Definition: clipper.hpp:142
ClipperLib::etClosedPolygon
@ etClosedPolygon
Definition: clipper.hpp:131
ClipperLib::ClipperOffset::AddPath
void AddPath(const Path &path, JoinType joinType, EndType endType)
Definition: clipper.cpp:3838
ClipperLib::ClipperOffset::ArcTolerance
double ArcTolerance
Definition: clipper.hpp:369
ClipperLib::pftPositive
@ pftPositive
Definition: clipper.hpp:70
ClipperLib::cInt
signed long long cInt
Definition: clipper.hpp:77
ClipperLib::ptSubject
@ ptSubject
Definition: clipper.hpp:65
ClipperLib::Round
cInt Round(double val)
Definition: clipper.cpp:172
ClipperLib::ClipperOffset::Execute
void Execute(Paths &solution, double delta)
Definition: clipper.cpp:3916
ClipperLib::ctUnion
@ ctUnion
Definition: clipper.hpp:64
NEAR_ZERO
#define NEAR_ZERO(val)
Definition: clipper.cpp:100
ClipperLib::Orientation
bool Orientation(const Path &poly)
Definition: clipper.cpp:421
ClipperLib::pi
static const double pi
Definition: clipper.cpp:89
sdf.r
int r
Definition: sdf.py:8
ClipperLib::ClipperOffset::m_sin
double m_sin
Definition: clipper.hpp:375
ClipperLib::def_arc_tolerance
static const double def_arc_tolerance
Definition: clipper.cpp:91
ClipperLib::ClipperOffset::m_destPoly
Path m_destPoly
Definition: clipper.hpp:373
ClipperLib::UpdateOutPtIdxs
void UpdateOutPtIdxs(OutRec &outrec)
Definition: clipper.cpp:3336
ClipperLib::two_pi
static const double two_pi
Definition: clipper.cpp:90
ClipperLib::ClipperOffset::DoMiter
void DoMiter(int j, int k, double r)
Definition: clipper.cpp:4217
a
constexpr double a
Definition: approx_sphere.cpp:30
ClipperLib::etOpenSquare
@ etOpenSquare
Definition: clipper.hpp:131
delta
static constexpr double delta
Definition: prism_elements_from_surface.cpp:18
ClipperLib::ClipperOffset::m_delta
double m_delta
Definition: clipper.hpp:375
ClipperLib::JoinType
JoinType
Definition: clipper.hpp:130
ClipperLib::PolyNode::ChildCount
int ChildCount() const
Definition: clipper.cpp:223
ClipperLib::pftNegative
@ pftNegative
Definition: clipper.hpp:70
ClipperLib::ClipperOffset::FixOrientations
void FixOrientations()
Definition: clipper.cpp:3890
ClipperLib::ReversePath
void ReversePath(Path &p)
Definition: clipper.cpp:4312
ClipperLib::ClipperOffset::MiterLimit
double MiterLimit
Definition: clipper.hpp:368
ClipperLib::ClipperOffset::m_destPolys
Paths m_destPolys
Definition: clipper.hpp:371
ClipperLib::IntPoint::X
cInt X
Definition: clipper.hpp:86
i
FTensor::Index< 'i', SPACE_DIM > i
Definition: hcurl_divergence_operator_2d.cpp:27
ClipperLib::etOpenButt
@ etOpenButt
Definition: clipper.hpp:131
ClipperLib::jtMiter
@ jtMiter
Definition: clipper.hpp:130
ClipperLib::ClipperOffset::DoRound
void DoRound(int j, int k)
Definition: clipper.cpp:4225
convert.n
n
Definition: convert.py:82
ClipperLib::ClipperOffset::OffsetPoint
void OffsetPoint(int j, int &k, JoinType jointype)
Definition: clipper.cpp:4160
ClipperLib::ClipperOffset::m_srcPoly
Path m_srcPoly
Definition: clipper.hpp:372
j
FTensor::Index< 'j', 3 > j
Definition: matrix_function.cpp:19
ClipperLib::jtRound
@ jtRound
Definition: clipper.hpp:130
ClipperLib::ClipperOffset::m_cos
double m_cos
Definition: clipper.hpp:375
ClipperLib::Poly2ContainsPoly1
bool Poly2ContainsPoly1(OutPt *OutPt1, OutPt *OutPt2)
Definition: clipper.cpp:562
ClipperLib::etClosedLine
@ etClosedLine
Definition: clipper.hpp:131
ClipperLib::ClipperOffset::m_StepsPerRad
double m_StepsPerRad
Definition: clipper.hpp:376
ClipperLib::GetUnitNormal
DoublePoint GetUnitNormal(const IntPoint &pt1, const IntPoint &pt2)
Definition: clipper.cpp:3798
ClipperLib::ClipperOffset::m_normals
std::vector< DoublePoint > m_normals
Definition: clipper.hpp:374
ClipperLib::ClipperOffset::m_sinA
double m_sinA
Definition: clipper.hpp:375
k
FTensor::Index< 'k', 3 > k
Definition: matrix_function.cpp:20
convert.int
int
Definition: convert.py:64