public void CreateCap(VertexStore output, VertexDistance v0, VertexDistance v1, double len)
{
output.Clear();
double dx1 = (v1.y - v0.y) / len;
double dy1 = (v1.x - v0.x) / len;
double dx2 = 0;
double dy2 = 0;
dx1 *= m_width;
dy1 *= m_width;
if (m_line_cap != LineCap.Round)
{
if (m_line_cap == LineCap.Square)
{
dx2 = dy1 * m_width_sign;
dy2 = dx1 * m_width_sign;
}
AddVertex(output, v0.x - dx1 - dx2, v0.y + dy1 - dy2);
AddVertex(output, v0.x + dx1 - dx2, v0.y - dy1 - dy2);
}
else
{
double da = Math.Acos(m_width_abs / (m_width_abs + 0.125 / m_approx_scale)) * 2;
double a1;
int i;
int n = (int)(Math.PI / da);
da = Math.PI / (n + 1);
AddVertex(output, v0.x - dx1, v0.y + dy1);
if (m_width_sign > 0)
{
a1 = Math.Atan2(dy1, -dx1);
a1 += da;
for (i = 0; i < n; i++)
{
AddVertex(output, v0.x + Math.Cos(a1) * m_width,
v0.y + Math.Sin(a1) * m_width);
a1 += da;
}
}
else
{
a1 = Math.Atan2(-dy1, dx1);
a1 -= da;
for (i = 0; i < n; i++)
{
AddVertex(output, v0.x + Math.Cos(a1) * m_width,
v0.y + Math.Sin(a1) * m_width);
a1 -= da;
}
}
AddVertex(output, v0.x + dx1, v0.y - dy1);
}
}