明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 10644|回复: 15

有凸度的多段线问题

  [复制链接]
发表于 2007-4-21 00:27:00 | 显示全部楼层 |阅读模式

已知多段线中第i段的凸度,及所有的多段线顶点坐标。

可以求出第i段所等价的圆弧的半径,但是怎么求出这个等价圆弧所对应的圆心坐标?

圆心可以求出两个(凹或凸时分别对应一个),不知怎么判断取舍?换句话说怎么判断圆弧是向上凸还是向下凹?

根据凸度正负判断不出,因为:

比如:

当多段线起始点至终点是由左向右时,圆弧为凹时的凸度为正,圆心在多段线上方;

当多段线起始点至终点是由右向左时,圆弧为凸时的凸度为正,圆心在多段线下方;

所以知道凸度为正也无法取舍求出的两个圆心哪个为正确值。

不知有什么高明的方法?

发表于 2007-4-27 09:38:00 | 显示全部楼层

d

关注。。。

我也在做这方面的思考 我想肯定是会有办法的 其实通过多段线的 explode 方法可以还原为line和arc也是一个变通的方法。只是麻烦了。

多线的的数据信息 只是点坐标 和凸度 autocad 也是通过这两个数据来 正确还原为line和 arc 的所以从理论上说 我们也可以 只是还没有找到 正确的方法

发表于 2007-4-27 10:51:00 | 显示全部楼层
根据两个端点坐标应是可以判断出来的啊。
发表于 2007-4-27 10:51:00 | 显示全部楼层
根据两个端点坐标应是可以判断出来的啊。
 楼主| 发表于 2007-4-27 23:17:00 | 显示全部楼层
fjfhgdwfn发表于2007-4-27 10:51:00根据两个端点坐标应是可以判断出来的啊。

能否具体说明一下。
发表于 2007-4-28 16:50:00 | 显示全部楼层

假设你的两点是A1,A2,凸度为N,则可以求得半径为R,圆心C到直线A1-A2的距离为L

A1-A2的中点为A3,方位角为B,则直线A3-C的方向位可根据N的正负判断是加减90度(正加,负减),则根据A3点的坐标及直线A3-C的方位角及长度可得到C点的坐标。

发表于 2007-5-6 14:20:00 | 显示全部楼层
继续关注中  思路有了 就差代码实现了 关键是求出
R可是R怎么求得呢
发表于 2007-5-23 09:29:00 | 显示全部楼层
顶一下
发表于 2007-5-23 13:35:00 | 显示全部楼层

凸度是多段线顶点列表中选定顶点和下一顶点之间的圆弧所包含角度的 1/4 的正切值。负的凸度值表示圆弧从选定顶点到下一顶点为顺时针方向。凸度为0 表示直线段,凸度为1表示半圆。

发表于 2007-6-10 13:19:00 | 显示全部楼层

终于解决了!花了好几天的工夫,尝试不同的方法。终于解决了。

应该感谢fjfhgdwfn提供的的思路。根据有凸度多段线的起点和端点。还有凸度,就可以求出圆心,楼主说可以求出两个圆心,我也是在这个问题上卡了很长一段时间。关键是应当根据弦的方向角求处矢的方向角根据其中点落在不同的象限来确定唯一的圆心坐标值。下面是代码。只是给出关键函数的实现,其他辅助函数很简单可以按需要实现。

希望大家都能热心解决难题。热心回馈社区,共建强大的开发社区

Public Function getCenter(Pst As Variant, Ped As Variant, ByVal nBulge As Double) As Double()
'根据2端点,和凸度计算  多段线的圆心
 Dim p1() As Double
 Dim p2() As Double
 Dim nSlope As Double
 Dim K As Double 
 Dim nAngle As Double 
 Dim Pcenter(2) As Double
 Dim nArrow As Double 
 Dim midP() As Double 
 Dim radAngle As Double 
 Dim nDirectAngle As Double 
 p1 = Pst
 p2 = Ped
 midP = getMiddlePoint(p1, p2)
 nArrow = getArrow(p1, p2, nBulge)
 radAngle = Atn(Abs(nBulge)) * 4
 Dim X As Double
 Dim Y As Double
 If nArrow = 0 Then
     Pcenter(0) = midP(0)
     Pcenter(1) = midP(1)
     Pcenter(2) = 0
     getCenter = Pcenter
     Exit Function
 End If
 If (nBulge > 0 And radAngle < PI) Or (nBulge < 0 And radAngle > PI) Then
     nDirectAngle = getDirectionAngle(Pst, Ped) + PI / 2
 End If
 If (nBulge < 0 And radAngle < PI) Or (nBulge > 0 And radAngle > PI) Then
     nDirectAngle = getDirectionAngle(Pst, Ped) - PI / 2
 End If
 If nDirectAngle > 2 * PI Then nDirectAngle = nDirectAngle - 2 * PI
 Select Case nDirectAngle
        Case 0
          Pcenter(0) = midP(0) + nArrow
          Pcenter(1) = midP(1)
          getCenter = Pcenter
          Exit Function
        Case PI / 2
          Pcenter(0) = midP(0)
          Pcenter(1) = midP(1) + nArrow
          getCenter = Pcenter
          Exit Function
        Case PI
          Pcenter(0) = midP(0) - nArrow
          Pcenter(1) = midP(1)
          getCenter = Pcenter
          Exit Function
        Case PI + PI / 2
          Pcenter(0) = midP(0)
          Pcenter(1) = midP(1) - nArrow
          getCenter = Pcenter
          Exit Function
 End Select
 nSlope = (p2(1) - p1(1)) / (p2(0) - p1(0))
 K = -1 / nSlope
 nAngle = Atn(K)
    X = Cos(nAngle) * nArrow
    Y = Sin(nAngle) * nArrow
 If nDirectAngle > PI / 2 And nDirectAngle < PI Then
    X = -X
    Y = -Y
 End If
 If nDirectAngle > PI And nDirectAngle < (PI + PI / 2) Then
    X = -X
    Y = -Y
 End If
 center(0) = midP(0) + X
 center(1) = midP(1) + Y
 getCenter = Pcenter
End Function

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-4-29 05:35 , Processed in 0.173072 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表