void QTriangulatingStroker::arcPoints(float cx, float cy, float fromX, float fromY, float toX, float toY, QVarLengthArray<float> &points) { float dx1 = fromX - cx; float dy1 = fromY - cy; float dx2 = toX - cx; float dy2 = toY - cy; // while more than 180 degrees left: while (dx1 * dy2 - dx2 * dy1 < 0) { float tmpx = dx1 * m_cos_theta - dy1 * m_sin_theta; float tmpy = dx1 * m_sin_theta + dy1 * m_cos_theta; dx1 = tmpx; dy1 = tmpy; points.push_back(cx + dx1); points.push_back(cy + dy1); } // while more than 90 degrees left: while (dx1 * dx2 + dy1 * dy2 < 0) { float tmpx = dx1 * m_cos_theta - dy1 * m_sin_theta; float tmpy = dx1 * m_sin_theta + dy1 * m_cos_theta; dx1 = tmpx; dy1 = tmpy; points.push_back(cx + dx1); points.push_back(cy + dy1); } // while more than 0 degrees left: while (dx1 * dy2 - dx2 * dy1 > 0) { float tmpx = dx1 * m_cos_theta - dy1 * m_sin_theta; float tmpy = dx1 * m_sin_theta + dy1 * m_cos_theta; dx1 = tmpx; dy1 = tmpy; points.push_back(cx + dx1); points.push_back(cy + dy1); } // remove last point which was rotated beyond [toX, toY]. if (!points.empty()) points.resize(points.size() - 2); }