一些vector变量同本专栏的第一篇,只是多了一个:
std::vector<DL_HatchEdgeData> dxfFillEdges
现只展示圆弧标注部分:
/// <summary>
/// 画dwf圆弧
/// </summary>
/// <param name="center">圆心</param>
/// <param name="p1">起点</param>
/// <param name="p2">中间点,用以判断弧长张开的方向</param>
/// <param name="p3">终点</param>
void drawDwfArc(Point2f center, Point2f p1, Point2f p2, Point2f p3,double radius)
{
double start = atan2(p1.y - center.y, p1.x - center.x) / CV_PI * 180;
double end = atan2(p3.y - center.y, p3.x - center.x) / CV_PI * 180;
double clampAngle = atan2(p3.y - p2.y, p3.x - p2.x) - atan2(p1.y - p2.y, p1.x - p2.x);//计算夹角
clampAngle = clampAngle / CV_PI * 180;
if (clampAngle > 90)//如果是钝角,那么张开的圆弧角则是钝角
{
double temp = start;
start = end;
end = temp;
}
DL_ArcData arc(center.x, center.y, 0, radius, start, end);
dxfArcs.push_back(arc);
//箭柄
Point2f midChord = (p2 + p3) / 2;
double leanAngle = atan2(midChord.y - center.y, midChord.x - center.x) / CV_PI * 180;
Point2f circlePoint(center.x + radius * cos(leanAngle / 180 * CV_PI), center.y + radius * sin(leanAngle / 180 * CV_PI));
double len = 15;
double alpha = 30;
dxfLines.push_back(DL_LineData(center.x + 2 * radius * cos(leanAngle / 180 * CV_PI), center.y + 2 * radius * sin(leanAngle / 180 * CV_PI),
0, center.x,center.y,0));
//箭角边
len = 5;
Point2f arrow;
arrow.x = circlePoint.x + len * cos((leanAngle + alpha) / 180 * CV_PI);
arrow.y = circlePoint.y + len * sin((leanAngle + alpha) / 180 * CV_PI);
dxfLines.push_back(DL_LineData(arrow.x, arrow.y, 0, circlePoint.x, circlePoint.y, 0));
dxfFillEdges.push_back(DL_HatchEdgeData(arrow.x, arrow.y, circlePoint.x, circlePoint.y));
Point2f arrow2;
arrow2.x = circlePoint.x + len * cos((leanAngle - alpha) / 180 * CV_PI);
arrow2.y = circlePoint.y + len * sin((leanAngle - alpha) / 180 * CV_PI);
dxfLines.push_back(DL_LineData(circlePoint.x, circlePoint.y, 0, arrow2.x, arrow2.y, 0));
dxfFillEdges.push_back(DL_HatchEdgeData(circlePoint.x, circlePoint.y,arrow2.x, arrow2.y));
dxfFillEdges.push_back(DL_HatchEdgeData(arrow2.x, arrow2.y, arrow.x, arrow.y));
//文字标注
char buffer[80];+
sprintf(buffer, "R%.1f", radius);
dxfTexts.push_back(DL_TextData(circlePoint.x + 5, circlePoint.y, 0,//text location
0, 0.0, 0.0, //对齐坐标,
3, 2,///文本高度和scale
leanAngle < 0 ? 0 : 4,
0, 0,
buffer,
"Standard",//字体
leanAngle));//旋转角度
}
想填充红色箭头来着,用的方法可能不对:
if (dxfFillEdges.size() > 0)
{
dxf.writeHatch1(*dw, DL_HatchData(), DL_Attributes(std::string(""),
DL_Codes::red,
-1,
1,
"BYLAYER"
));
for (int i = 0; i < dxfFillEdges.size(); i += 3)
{
dxf.writeHatchLoop1(*dw, DL_HatchLoopData(3));
dxf.writeHatchEdge(*dw, dxfFillEdges[i]);
dxf.writeHatchEdge(*dw, dxfFillEdges[i+1]);
dxf.writeHatchEdge(*dw, dxfFillEdges[i+2]);
dxf.writeHatchLoop2(*dw, DL_HatchLoopData(3));
}
dxf.writeHatch2(*dw, DL_HatchData(), DL_Attributes(std::string(""),
DL_Codes::red,
-1,
1,
"BYLAYER"
));
}
希望懂行的能指导一下 ,谢谢!