PdfContentByte cb = writer.DirectContent;
//第一二个参数代表起始点的XY坐标,三四参数代表拉伸点的坐标,五六参数代表终止点的坐标
cb.Arc(350f, 70f, 550f, 130f, 270f, 90f);
cb.SetLineDash(3f, 3f);
cb.Fill();
//以下使用贝塞尔曲线画扇形,思路在圆内构建正多边形,确定多边形的顶点
int r = 200;
PointF p0 = new PointF(300, 590);
PointF p1 = getPointF(p0, r, 0);
List<PointF> pointList = getPolygonPoint(15, p0, p1);
double xdiff = p1.X - pointList[0].X;
double ydiff = p1.Y - pointList[0].Y; ;
double distance = Math.Sqrt(xdiff * xdiff + ydiff * ydiff);
float newR = getWR(r, 15, distance);
PointF p3 = getPointF(p0, newR, 0);
PointF p2 = getPointF(p0, newR, 0);
List<PointF> pointList1 = getPolygonPoint(15, p0, p3);
List<PointF> pointList2 = getPolygonPoint(30, p0, p2);
//cb.MoveTo(p0.X, p0.Y);
//cb.CurveFromTo(p0.X, p0.Y, p1.X, p1.Y);
//cb.CurveTo(p1.X, p1.Y, pointList[0].X, pointList[0].Y, pointList[1].X, pointList[1].Y);
//cb.FillStroke();
cb.SetColorFill(BaseColor.GREEN);
cb.MoveTo(p2.X, p2.Y);
foreach (PointF p in pointList2)
{
cb.LineTo(p.X, p.Y);
}
cb.Fill();
cb.SetColorFill(BaseColor.YELLOW);
cb.MoveTo(p3.X, p3.Y);
foreach (PointF p in pointList1)
{
cb.LineTo(p.X, p.Y);
}
cb.Fill();
cb.Circle(p0.X, p0.Y, 3);
cb.Fill();
cb.Circle(p1.X, p1.Y, 6);
cb.Fill();
cb.Circle(pointList[0].X, pointList[0].Y, 9);
cb.Fill();
cb.Circle(pointList[1].X, pointList[1].Y, 12);
cb.Fill();
cb.SetColorFill(BaseColor.GRAY);
cb.MoveTo(p1.X, p1.Y);
foreach (PointF p in pointList)
{
cb.LineTo(p.X, p.Y);
}
cb.Fill();
cb.SetColorStroke(BaseColor.RED);
cb.SetColorFill(BaseColor.RED);
cb.MoveTo(p0.X, p0.Y);
cb.CurveFromTo(p0.X, p0.Y, p1.X, p1.Y);
cb.CurveTo(p1.X, p1.Y, pointList2[0].X, pointList2[0].Y, pointList[0].X, pointList[0].Y);
cb.FillStroke();
cb.Circle(p0.X, p0.Y, r);
cb.Stroke();
cb.SetColorStroke(BaseColor.BLACK);
cb.Circle(p0.X, p0.Y, newR);
cb.Stroke();
//得到新圆的半径
private float getWR(float r, int n, double a)
{
double b = a * Math.Sin(360 / 2 / n);
double newR = Math.Sqrt(Math.Pow(b, 2) + Math.Pow(r, 2));
// double newR = r / Math.Cos(360 / n / 2);
return (float)newR;
}
//根据圆心,半径,角度数得到圆上的一点
private PointF getPointF(PointF p0, float r, int angle = 45)
{
float Y = p0.Y + (float)(r * Math.Sin(angle * Math.PI / 180));
float X = p0.X + (float)(r * Math.Cos(angle * Math.PI / 180));
return new PointF(X, Y);
}
//根据边数,圆心,以及圆上一点得到正多边形的其他顶点
private List<PointF> getPolygonPoint(int polygon, PointF p0, PointF p1)
{
Matrix rotation = new Matrix();
rotation.RotateAt(360 / polygon, new System.Drawing.PointF(p0.X, p0.Y));//60为角度,如12边行为30
PointF[] pointf = new PointF[] { p1 };
List<PointF> lst = new List<PointF>();
for (int i = 0; i < polygon - 1; i++)
{
rotation.TransformPoints(pointf);
lst.Add(pointf[0]);
}
return lst;
}
图形使用贝塞尔曲线所话 ,以下为主要代码
cb.SetColorStroke(BaseColor.RED);
cb.SetColorFill(BaseColor.RED);
cb.MoveTo(p0.X, p0.Y);
cb.CurveFromTo(p0.X, p0.Y, p1.X, p1.Y);
cb.CurveTo(p1.X, p1.Y, pointList2[0].X, pointList2[0].Y, pointList[0].X, pointList[0].Y);
cb.FillStroke();
以上代码为网上查找资料,自己整理,希望能帮助到更多同样需求的同伴