已知圆弧的起点端点和凸度计算圆心

最近翻看我以前的博文,看到计算LWPLINE中凸度圆弧的圆心的公式那篇,一时竟想不起这公式是如何推导的了。

http://blog.sina.com.cn/s/blog_66349acf0102vivw.html

这里把推导过程简单描述一下,为了以后不再忘记。

注:本来想发在新浪博客上,奈何人家在维护,要5月才能恢复,已经写好的文,怕丢失,就发到了这里。

 

首先要明确lwpline中圆弧的定义,在Autodesk的文档中能见到两种叙述:

1,凸度是圆弧圆心角的四分之一的正切

2,凸度等于圆弧的弓高和圆弧的前进距离的比,即凸度=2H/L,H为弓高,L为前进的长度,也即弦长。

 

这2种叙述表达的含义是一致的,只是第一种方便计算,第二种更直观。

 

 

从图上可知,此段圆弧的凸度 bulge=2H/L=tan(β)=tan(α/2)

这里α=2β,应该可以证明的。

(补充一下这个证明,见下图,从图上可看出,90 = α/2 + γ  = β + γ,即 β = α/2)

可以想象,以AB的中点C为圆心,以红线段的长度为半径(记为r),以CB为起始位置逆时针旋转90度就能得到O点。

记AB的倾角为θ,则

cos(\theta)=\frac{x2-x1}{L}

sin(\theta)=\frac{y2-y1}{L}

那么O点的坐标为:

x=x_{c}+r*cos(\frac{\pi }{2}+\theta)=x_{c}-r*sin(\theta)

y=y_{c}+r*sin(\frac{\pi}{2}+\theta)=y_{c}+r*cos(\theta)        .................................. (1)

 

我们知道 α=2β, 所以:

tan(\alpha)=\frac{2tan(\beta)}{1-tan^{2}(\beta)}

 

r=\frac{L}{2}*ctan(\alpha)=\frac{L}{2}*\frac{1}{2}*(\frac{1}{bulge}-bulge)

记:

b=\frac{1}{2}*(\frac{1}{bulge}-bulge)

那么:

r=\frac{L}{2}*b

 

把C点坐标( (x1+x2)/2, (y1+y2)/2), r,以及sin(θ), cos(θ) 带入公式(1),得到O点的坐标为:

x=\frac{x1+x2}{2} - \frac{L}{2}*b*\frac{y2-y1}{L}

y=\frac{y1+y2}{2}+\frac{L}{2}*b*\frac{x2-x1}{L}

 

化简后得:

\LARGE {\color{Red} x=0.5*((x1+x2)-b*(y2-y1))}

\LARGE {\color{Red} y=0.5*((y1+y2)+b*(x2-x1))}

其中:

b=\frac{1}{2}*(\frac{1}{bulge}-bulge)

 

以上公式是以逆时针劣弧推导的结果,那么对于逆时针优弧以及顺时针优劣弧是否也适用呢?

答案是:适用!不用做任何更改。

 

秘密就在于参数b具有自动调节功能。

下面简单分析一下。

 

上面是逆时针优弧,此时的凸度bulge>1,那么b<0,所以 r<0

 

X = Xc + r*cos(π/2+θ) = Xc + (-|r|)cos(π/2+θ) = Xc + |r|sin(θ) = Xc + |r|cos(π/2-θ) = Xc + |r|cos(θ-π/2)

Y = Yc + r*sin(π/2+θ)= Yc + (-|r|sin(π/2+θ) =  Yc + |r|(-sin(π/2-θ)) = Yc + |r|sin(θ-π/2)

 

即:逆时针旋转一个负的向量,相当于顺时针旋转其反向量(正向量)。

从图上可以直观的看到,实际是顺时针旋转到达的圆心位置。

 


 

这是一个顺时针的劣弧,凸度bulge < 0, |bulge| < 1, 可以得到 b < 0, r < 0

与上面一样的道理,也是顺时针旋转到达圆心位置。

 


 

这是一个顺时针的优弧,bulge<0且 |bulge|>1, 那么 b>0, r>0

对于r>0的情况,仍然是逆时针旋转。

 

====================================

所以,正是由于bulge可正可负,参数b才天生具有调节旋转方向的功能。

因此,无需讨论bulge是否正负,统统使用一组公式即可计算出圆心。

 

最后感慨一句:

Autodesk用凸度的正负表示圆弧的方向,真乃神来之笔。

 

  • 23
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
根据提供的引用内容,可以使用以下步骤在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; ``` 请注意,上述代码仅为示例,实际应用中可能需要根据具体情况进行调整和优化。
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值