凸度的计算

AutoCAD中凸度的概念以及求圆弧的凸度  

The bulge factor is used to indicate how much of an arc segment is present at this vertex. The bulge factor is the tangent of one fourth the included angle for an arc segment, made negative if the arc goes clockwise from the start point to the endpoint. A bulge of 0 indicates a straight segment, and a bulge of 1 is a semicircle.

凸度被用来表示一个顶点的弧度大小,它的值是这段弧所包含角度的1/4角度的正切。如果弧从起点到终点是顺时针走向则凸度为负数,0表示直线,1表示半圆。

AutoCAD中凸度的概念以及求圆弧的凸度 - 风华正茂 - 乐趣来自探索
 

在将圆弧转化为多段线(AcDbPolyLine)时,需要计算圆弧的凸度。在AutoCAD中规定,圆弧的走向始终是逆时针走向,所以终点角度应大小起点角度(以圆心为原点中,以X轴正方向为0,逆时针旋转为正角)。当终点角度小于起点角度时,应加上2π(下图中的图3和图4)这样得到的凸度值表示逆时针走向的凸度,当需要表示顺时针方面的弧度时,需要在这个值前面加负号。

下图中,图1,图2的绘制方向相反,但起点(小圆表示)到终点(小三角形表示)的走向是一样的。同理图3和图4也是一样但在计算凸度时终点角度小于起点角度,应加上2π。

AutoCAD中凸度的概念以及求圆弧的凸度 - 风华正茂 - 乐趣来自探索
 
AutoCAD中凸度的概念以及求圆弧的凸度 - 风华正茂 - 乐趣来自探索
 
AutoCAD中凸度的概念以及求圆弧的凸度 - 风华正茂 - 乐趣来自探索
 
AutoCAD中凸度的概念以及求圆弧的凸度 - 风华正茂 - 乐趣来自探索 


以下是其算法(注意得到的值是逆时针走向的凸度)

double GetBulge(AcDbArc*& pArc)

{

double dStartAngle = pArc->startAngle();

double dEndAngle = pArc->endAngle();

double dAlfa = dEndAngle - dStartAngle;

if (dAlfa < 0.0)//如果终点角度小于起点角度

{

dAlfa = 2 * PI + dAlfa;

}

double dBulge = 0.0;

dBulge = tan((dAlfa) / 4.0);

return dBulge;

}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,可以使用以下步骤在Matlab中计算图像轮廓的凸度: 1. 读取图像并转换为灰度图像。 2. 对灰度图像进行阈值化处理,得到二值图像。 3. 对二值图像进行膨胀处理,使图像中的轮廓更明显。 4. 使用边缘检测算法(如Canny算法)提取图像的边缘。 5. 使用cv.convexHull函数计算图像边缘的凸包。 6. 计算凸包的面积和轮廓的长度。 7. 根据凸包的面积和轮廓的长度计算轮廓的凸度。 以下是一个Matlab示例代码,演示了如何计算图像轮廓的凸度: ```matlab % 读取图像并转换为灰度图像 img = imread('image.jpg'); grayImg = rgb2gray(img); % 阈值化处理得到二值图像 brightnessThreshold = 100; binBrightImg = grayImg > brightnessThreshold; % 膨胀处理 se = strel('disk', 3); dilatedImg = imdilate(binBrightImg, se); % 边缘检测 edgeImg = edge(dilatedImg); % 计算凸包 [B, L] = bwboundaries(edgeImg, 'noholes'); convexHull = cellfun(@(x) convhull(x(:,2), x(:,1)), B, 'UniformOutput', false); % 计算凸度 convexity = cellfun(@(x) polyarea(x(:,2), x(:,1)) / length(x), convexHull); % 显示结果 imshow(img); hold on; for k = 1:length(B) boundary = B{k}; plot(boundary(:,2), boundary(:,1), 'r', 'LineWidth', 2); text(boundary(1,2), boundary(1,1), sprintf('%.2f', convexity(k)), 'Color', 'y'); end hold off; ``` 请注意,上述代码仅为示例,实际应用中可能需要根据具体情况进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值