StartMe 发表于 2007-4-21 00:27:00

有凸度的多段线问题

<p>已知多段线中第i段的凸度,及所有的多段线顶点坐标。</p><p>可以求出第i段所等价的圆弧的半径,但是怎么求出这个等价圆弧所对应的圆心坐标?</p><p>圆心可以求出两个(凹或凸时分别对应一个),不知怎么判断取舍?换句话说怎么判断圆弧是向上凸还是向下凹?</p><p>根据凸度正负判断不出,因为:</p><p>比如:</p><p>当多段线起始点至终点是由左向右时,圆弧为凹时的凸度为正,圆心在多段线上方;</p><p>当多段线起始点至终点是由右向左时,圆弧为凸时的凸度为正,圆心在多段线下方;</p><p>所以知道凸度为正也无法取舍求出的两个圆心哪个为正确值。</p><p>不知有什么高明的方法?</p>

Snowflying 发表于 2007-4-27 09:38:00

d

<p>关注。。。</p><p>我也在做这方面的思考 我想肯定是会有办法的 其实通过多段线的 explode 方法可以还原为line和arc也是一个变通的方法。只是麻烦了。</p><p>多线的的数据信息 只是点坐标 和凸度 autocad 也是通过这两个数据来 正确还原为line和 arc 的所以从理论上说 我们也可以 只是还没有找到 正确的方法 </p>

fjfhgdwfn 发表于 2007-4-27 10:51:00

根据两个端点坐标应是可以判断出来的啊。

fjfhgdwfn 发表于 2007-4-27 10:51:00

根据两个端点坐标应是可以判断出来的啊。

StartMe 发表于 2007-4-27 23:17:00

fjfhgdwfn发表于2007-4-27 10:51:00static/image/common/back.gif根据两个端点坐标应是可以判断出来的啊。

<p></p>能否具体说明一下。

fjfhgdwfn 发表于 2007-4-28 16:50:00

<p>假设你的两点是A1,A2,凸度为N,则可以求得半径为R,圆心C到直线A1-A2的距离为L</p><p>A1-A2的中点为A3,方位角为B,则直线A3-C的方向位可根据N的正负判断是加减90度(正加,负减),则根据A3点的坐标及直线A3-C的方位角及长度可得到C点的坐标。</p>

Snowflying 发表于 2007-5-6 14:20:00

继续关注中&nbsp; 思路有了 就差代码实现了 关键是求出<br/>R可是R怎么求得呢

Snowflying 发表于 2007-5-23 09:29:00

顶一下

fjfhgdwfn 发表于 2007-5-23 13:35:00

<p class="body">凸度是多段线顶点列表中选定顶点和下一顶点之间的圆弧所包含角度的 1/4 的正切值。负的凸度值表示圆弧从选定顶点到下一顶点为顺时针方向。凸度为0 表示直线段,凸度为1表示半圆。<script language="javascript" src="ac.acad_mc.js"></script>
        </p>

Snowflying 发表于 2007-6-10 13:19:00

<p>终于解决了!花了好几天的工夫,尝试不同的方法。终于解决了。</p><p><strong><font face="Verdana" color="#61b713">应该感谢fjfhgdwfn提供的的思路。根据有凸度多段线的起点和端点。还有凸度,就可以求出圆心,楼主说可以求出两个圆心,我也是在这个问题上卡了很长一段时间。关键是应当根据弦的方向角求处矢的方向角根据其中点落在不同的象限来确定唯一的圆心坐标值。下面是代码。只是给出关键函数的实现,其他辅助函数很简单可以按需要实现。</font></strong></p><p><strong><font face="Verdana" color="#61b713">希望大家都能热心解决难题。热心回馈社区,共建强大的开发社区</font></strong></p><p><strong><font face="Verdana" color="#61b713">Public Function getCenter(Pst As Variant, Ped As Variant, ByVal nBulge As Double) As Double()<br/>'根据2端点,和凸度计算&nbsp; 多段线的圆心<br/>&nbsp;Dim p1() As Double<br/>&nbsp;Dim p2() As Double<br/>&nbsp;Dim nSlope As Double<br/>&nbsp;Dim K As Double&nbsp; <br/>&nbsp;Dim nAngle As Double&nbsp; <br/>&nbsp;Dim Pcenter(2) As Double<br/>&nbsp;Dim nArrow As Double&nbsp; <br/>&nbsp;Dim midP() As Double&nbsp; <br/>&nbsp;Dim radAngle As Double&nbsp; <br/>&nbsp;Dim nDirectAngle As Double&nbsp; <br/>&nbsp;p1 = Pst<br/>&nbsp;p2 = Ped<br/>&nbsp;midP = getMiddlePoint(p1, p2) <br/>&nbsp;nArrow = getArrow(p1, p2, nBulge) <br/>&nbsp;radAngle = Atn(Abs(nBulge)) * 4 <br/>&nbsp;Dim X As Double<br/>&nbsp;Dim Y As Double<br/>&nbsp;If nArrow = 0 Then<br/>&nbsp;&nbsp;&nbsp;&nbsp; Pcenter(0) = midP(0)<br/>&nbsp;&nbsp;&nbsp;&nbsp; Pcenter(1) = midP(1)<br/>&nbsp;&nbsp;&nbsp;&nbsp; Pcenter(2) = 0<br/>&nbsp;&nbsp;&nbsp;&nbsp; getCenter = Pcenter <br/>&nbsp;&nbsp;&nbsp;&nbsp; Exit Function<br/>&nbsp;End If<br/>&nbsp;If (nBulge &gt; 0 And radAngle &lt; PI) Or (nBulge &lt; 0 And radAngle &gt; PI) Then <br/>&nbsp;&nbsp;&nbsp;&nbsp; nDirectAngle = getDirectionAngle(Pst, Ped) + PI / 2<br/>&nbsp;End If<br/>&nbsp;If (nBulge &lt; 0 And radAngle &lt; PI) Or (nBulge &gt; 0 And radAngle &gt; PI) Then<br/>&nbsp;&nbsp;&nbsp;&nbsp; nDirectAngle = getDirectionAngle(Pst, Ped) - PI / 2<br/>&nbsp;End If<br/>&nbsp;If nDirectAngle &gt; 2 * PI Then nDirectAngle = nDirectAngle - 2 * PI<br/>&nbsp;Select Case nDirectAngle<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case 0<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pcenter(0) = midP(0) + nArrow<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pcenter(1) = midP(1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getCenter = Pcenter<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exit Function<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case PI / 2<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pcenter(0) = midP(0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pcenter(1) = midP(1) + nArrow<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getCenter = Pcenter<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exit Function<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case PI<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pcenter(0) = midP(0) - nArrow<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pcenter(1) = midP(1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getCenter = Pcenter<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exit Function<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case PI + PI / 2<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pcenter(0) = midP(0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pcenter(1) = midP(1) - nArrow<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getCenter = Pcenter<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exit Function<br/>&nbsp;End Select<br/>&nbsp;nSlope = (p2(1) - p1(1)) / (p2(0) - p1(0))<br/>&nbsp;K = -1 / nSlope<br/>&nbsp;nAngle = Atn(K) <br/>&nbsp;&nbsp;&nbsp; X = Cos(nAngle) * nArrow<br/>&nbsp;&nbsp;&nbsp; Y = Sin(nAngle) * nArrow<br/>&nbsp;If nDirectAngle &gt; PI / 2 And nDirectAngle &lt; PI Then<br/>&nbsp;&nbsp;&nbsp; X = -X<br/>&nbsp;&nbsp;&nbsp; Y = -Y<br/>&nbsp;End If<br/>&nbsp;If nDirectAngle &gt; PI And nDirectAngle &lt; (PI + PI / 2) Then <br/>&nbsp;&nbsp;&nbsp; X = -X<br/>&nbsp;&nbsp;&nbsp; Y = -Y<br/>&nbsp;End If<br/>&nbsp;Pcenter(0) = midP(0) + X<br/>&nbsp;Pcenter(1) = midP(1) + Y<br/>&nbsp;getCenter = Pcenter<br/>End Function</font></strong></p>
页: [1] 2
查看完整版本: 有凸度的多段线问题