//----- public void QuadraticCurveTo(SVGPoint p1, SVGPoint p, float width) { SVGPoint _point = new SVGPoint(0f, 0f); _point.SetValue(this._basicDraw.currentPoint); SVGPoint _p1 = new SVGPoint(0f, 0f); SVGPoint _p2 = new SVGPoint(0f, 0f); SVGPoint _p3 = new SVGPoint(0f, 0f); SVGPoint _p4 = new SVGPoint(0f, 0f); this._graphics.GetThickLine(_point, p1, width, ref _p1, ref _p2, ref _p3, ref _p4); SVGPoint _p5 = new SVGPoint(0f, 0f); SVGPoint _p6 = new SVGPoint(0f, 0f); SVGPoint _p7 = new SVGPoint(0f, 0f); SVGPoint _p8 = new SVGPoint(0f, 0f); this._graphics.GetThickLine(p1, p, width, ref _p5, ref _p6, ref _p7, ref _p8); SVGPoint _cp1, _cp2; _cp1 = this._graphics.GetCrossPoint(_p1, _p3, _p5, _p7); _cp2 = this._graphics.GetCrossPoint(_p2, _p4, _p6, _p8); SVGGraphicsPath _graphicsPath = new SVGGraphicsPath(); _graphicsPath.AddMoveTo(_p2); _graphicsPath.AddQuadraticCurveTo(_cp2, _p8); _graphicsPath.AddLineTo(_p7); _graphicsPath.AddQuadraticCurveTo(_cp1, _p1); _graphicsPath.AddLineTo(_p2); this._graphics.FillPath(_graphicsPath); MoveTo(p); }
//----- public void LineTo(SVGPoint p, float width) { SVGPoint _point = new SVGPoint(0f, 0f); _point.SetValue(this._basicDraw.currentPoint); Line(_point, p, width); MoveTo(p); }
//----- public void ArcTo(float r1, float r2, float angle, bool largeArcFlag, bool sweepFlag, SVGPoint p, float width) { float tx, ty, rx, ry; rx = r1; ry = r2; SVGPoint p1 = new SVGPoint(0f, 0f); SVGPoint p2 = new SVGPoint(0f, 0f); p1.SetValue(this._basicDraw.currentPoint); p2.SetValue(p); double trx2, try2, tx2, ty2; float temp1, temp2; float _radian = (angle * Mathf.PI / 180.0f); float _CosRadian = (float)Math.Cos(_radian); float _SinRadian = (float)Math.Sin(_radian); temp1 = (p1.x - p2.x) / 2.0f; temp2 = (p1.y - p2.y) / 2.0f; tx = (_CosRadian * temp1) + (_SinRadian * temp2); ty = (-_SinRadian * temp1) + (_CosRadian * temp2); trx2 = rx * rx; try2 = ry * ry; tx2 = tx * tx; ty2 = ty * ty; double radiiCheck = tx2 / trx2 + ty2 / try2; if(radiiCheck > 1) { rx = (float)Math.Sqrt((float)radiiCheck) * rx; ry = (float)Math.Sqrt((float)radiiCheck) * ry; trx2 = rx * rx; try2 = ry * ry; } double tm1; tm1 = (trx2 * try2 - trx2 * ty2 - try2 * tx2) / (trx2 * ty2 + try2 * tx2); tm1 = (tm1 < 0) ? 0 : tm1; float tm2; tm2 = (largeArcFlag == sweepFlag) ? -(float)Math.Sqrt((float)tm1) : (float)Math.Sqrt((float)tm1); float tcx, tcy; tcx = tm2 * ((rx * ty) / ry); tcy = tm2 * (-(ry * tx) / rx); float cx, cy; cx = _CosRadian * tcx - _SinRadian * tcy + ((p1.x + p2.x) / 2.0f); cy = _SinRadian * tcx + _CosRadian * tcy + ((p1.y + p2.y) / 2.0f); float ux = (tx - tcx) / rx; float uy = (ty - tcy) / ry; float vx = (-tx - tcx) / rx; float vy = (-ty - tcy) / ry; float _angle, _delta; float tp, n; n = (float)Math.Sqrt((ux * ux) + (uy * uy)); tp = ux; _angle = (uy < 0) ? -(float)Math.Acos(tp / n) : (float)Math.Acos(tp / n); _angle = _angle * 180.0f / Mathf.PI; _angle %= 360f; n = (float)Math.Sqrt((ux * ux + uy * uy) * (vx * vx + vy * vy)); tp = ux * vx + uy * vy; _delta = (ux * vy - uy * vx < 0) ? -(float)Math.Acos(tp / n) : (float)Math.Acos(tp / n); _delta = _delta * 180.0f / Mathf.PI; if(!sweepFlag && _delta > 0) { _delta -= 360f; } else if(sweepFlag && _delta < 0) _delta += 360f; _delta %= 360f; int number = 50; float deltaT = _delta / number; //---Get Control Point SVGPoint _controlPoint1 = new SVGPoint(0f, 0f); SVGPoint _controlPoint2 = new SVGPoint(0f, 0f); for(int i = 0; i <= number; i++) { float t_angle = (deltaT * i + _angle) * Mathf.PI / 180.0f; _controlPoint1.x = _CosRadian * rx * (float)Math.Cos(t_angle) - _SinRadian * ry * (float)Math.Sin(t_angle) + cx; _controlPoint1.y = _SinRadian * rx * (float)Math.Cos(t_angle) + _CosRadian * ry * (float)Math.Sin(t_angle) + cy; if((_controlPoint1.x != p1.x) && (_controlPoint1.y != p1.y)) { i = number + 1; } } for(int i = number; i >= 0; i--) { float t_angle = (deltaT * i + _angle) * Mathf.PI / 180.0f; _controlPoint2.x = _CosRadian * rx * (float)Math.Cos(t_angle) - _SinRadian * ry * (float)Math.Sin(t_angle) + cx; _controlPoint2.y = _SinRadian * rx * (float)Math.Cos(t_angle) + _CosRadian * ry * (float)Math.Sin(t_angle) + cy; if((_controlPoint2.x != p2.x) && (_controlPoint2.y != p2.y)) { i = -1; } } //----- SVGPoint _p1 = new SVGPoint(0f, 0f); SVGPoint _p2 = new SVGPoint(0f, 0f); SVGPoint _p3 = new SVGPoint(0f, 0f); SVGPoint _p4 = new SVGPoint(0f, 0f); this._graphics.GetThickLine(p1, _controlPoint1, width, ref _p1, ref _p2, ref _p3, ref _p4); SVGPoint _p5 = new SVGPoint(0f, 0f); SVGPoint _p6 = new SVGPoint(0f, 0f); SVGPoint _p7 = new SVGPoint(0f, 0f); SVGPoint _p8 = new SVGPoint(0f, 0f); this._graphics.GetThickLine(_controlPoint2, p2, width, ref _p5, ref _p6, ref _p7, ref _p8); float _half, _ihalf1, _ihalf2; _half = width / 2f; _ihalf1 = _half; _ihalf2 = width - _ihalf1 + 0.5f; //----- float t_len1, t_len2; t_len1 = (_p1.x - cx) * (_p1.x - cx) + (_p1.y - cy) * (_p1.y - cy); t_len2 = (_p2.x - cx) * (_p2.x - cx) + (_p2.y - cy) * (_p2.y - cy); SVGPoint tempPoint = new SVGPoint(0f, 0f); if(t_len1 > t_len2) { tempPoint.SetValue(_p1); _p1.SetValue(_p2); _p2.SetValue(tempPoint); } t_len1 = (_p7.x - cx) * (_p7.x - cx) + (_p7.y - cy) * (_p7.y - cy); t_len2 = (_p8.x - cx) * (_p8.x - cx) + (_p8.y - cy) * (_p8.y - cy); if(t_len1 > t_len2) { tempPoint.SetValue(_p7); _p7.SetValue(_p8); _p8.SetValue(tempPoint); } SVGGraphicsPath _graphicsPath = new SVGGraphicsPath(); _graphicsPath.AddMoveTo(_p2); _graphicsPath.AddArcTo(r1 + _ihalf1, r2 + _ihalf1, angle, largeArcFlag, sweepFlag, _p8); _graphicsPath.AddLineTo(_p7); _graphicsPath.AddArcTo(r1 - _ihalf2, r2 - _ihalf2, angle, largeArcFlag, !sweepFlag, _p1); _graphicsPath.AddLineTo(_p2); this._graphics.FillPath(_graphicsPath); MoveTo(p); }
//----- public void CubicCurveTo(SVGPoint p1, SVGPoint p2, SVGPoint p, float width) { SVGPoint _point = new SVGPoint(0f, 0f); _point.SetValue(this._basicDraw.currentPoint); SVGPoint _p1 = new SVGPoint(0f, 0f); SVGPoint _p2 = new SVGPoint(0f, 0f); SVGPoint _p3 = new SVGPoint(0f, 0f); SVGPoint _p4 = new SVGPoint(0f, 0f); bool temp; temp = this._graphics.GetThickLine(_point, p1, width, ref _p1, ref _p2, ref _p3, ref _p4); if(temp == false) { QuadraticCurveTo(p2, p, width); return; } SVGPoint _p5 = new SVGPoint(0f, 0f); SVGPoint _p6 = new SVGPoint(0f, 0f); SVGPoint _p7 = new SVGPoint(0f, 0f); SVGPoint _p8 = new SVGPoint(0f, 0f); this._graphics.GetThickLine(p1, p2, width, ref _p5, ref _p6, ref _p7, ref _p8); SVGPoint _p9 = new SVGPoint(0f, 0f); SVGPoint _p10 = new SVGPoint(0f, 0f); SVGPoint _p11 = new SVGPoint(0f, 0f); SVGPoint _p12 = new SVGPoint(0f, 0f); this._graphics.GetThickLine(p2, p, width, ref _p9, ref _p10, ref _p11, ref _p12); SVGPoint _cp1, _cp2, _cp3, _cp4; _cp1 = this._graphics.GetCrossPoint(_p1, _p3, _p5, _p7); _cp2 = this._graphics.GetCrossPoint(_p2, _p4, _p6, _p8); _cp3 = this._graphics.GetCrossPoint(_p5, _p7, _p9, _p11); _cp4 = this._graphics.GetCrossPoint(_p6, _p8, _p10, _p12); this._basicDraw.MoveTo(_point); this._basicDraw.CubicCurveTo(p1, p2, p); SVGGraphicsPath _graphicsPath = new SVGGraphicsPath(); _graphicsPath.AddMoveTo(_p2); _graphicsPath.AddCubicCurveTo(_cp2, _cp4, _p12); _graphicsPath.AddLineTo(_p11); _graphicsPath.AddCubicCurveTo(_cp3, _cp1, _p1); _graphicsPath.AddLineTo(_p2); this._graphics.FillPath(_graphicsPath); MoveTo(p); }