matrix 发表于 2006-4-18 16:19:00

如何判断曲线与直线相交,怎么求出交点

高手进来看一下,如果CAD的dwg图形上有一个曲线,在边上任取一点,往曲线上画,可以有一个交点,如果用VBA编程的话,可以选定一个曲线,再选定一个点,那么,如何判断该点可以以一个角度作的直线与曲线相交呢,交点坐标如何求呢,高手在的话,回一下贴啊,看看有没有什么好的算法,或者一些具体的函数,求助!!!!!!!!!!!!!!!!

雪山飞狐_lzh 发表于 2006-4-18 21:50:00

http://www.mccad.net/object/acad2004/idh_intersectwith.htm

matrix 发表于 2006-4-19 11:07:00

<P>你这个方法我在AUTOCAD帮助中的开发文档里找到了,里面有个例子,是画线,画圆,然后求交点, 我复制过去,运行出现了错误,代码如下:</P>
<P><BR>Public Sub CommandButton1_Click()<BR>UserForm1.Hide<BR>Dim lineObj As AcadLine<BR>&nbsp;&nbsp;&nbsp; Dim startPt(0 To 2) As Double<BR>&nbsp;&nbsp;&nbsp; Dim endPt(0 To 2) As Double<BR>&nbsp;&nbsp;&nbsp; startPt(0) = 1: startPt(1) = 1: startPt(2) = 0<BR>&nbsp;&nbsp;&nbsp; endPt(0) = 5: endPt(1) = 5: endPt(2) = 0<BR>&nbsp;&nbsp;&nbsp; Set lineObj = ThisDrawing.ModelSpace.AddLine(startPt, endPt)<BR>&nbsp;&nbsp;&nbsp; UserForm1.Show<BR>End Sub</P>
<P>Public Sub CommandButton2_Click()<BR>UserForm1.Hide<BR>Dim circleObj As AcadCircle<BR>&nbsp;&nbsp;&nbsp; Dim centerPt(0 To 2) As Double<BR>&nbsp;&nbsp;&nbsp; Dim radius As Double<BR>&nbsp;&nbsp;&nbsp; centerPt(0) = 3: centerPt(1) = 3: centerPt(2) = 0<BR>&nbsp;&nbsp;&nbsp; radius = 1<BR>&nbsp;&nbsp;&nbsp; Set circleObj = ThisDrawing.ModelSpace.AddCircle(centerPt, radius)<BR>&nbsp;&nbsp;&nbsp; ZoomAll<BR>UserForm1.Show</P>
<P>End Sub</P>
<P>Public Sub CommandButton3_Click()<BR>UserForm1.Hide<BR>Dim intPoints As Variant<BR>Set intPoints = lineObj.IntersectWith(circleObj, acExtendNone)<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; ' Print all the intersection points<BR>&nbsp;&nbsp;&nbsp; Dim I As Integer, j As Integer, k As Integer<BR>&nbsp;&nbsp;&nbsp; Dim str As String<BR>&nbsp;&nbsp;&nbsp; If VarType(intPoints) &lt;&gt; vbEmpty Then<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For I = LBound(intPoints) To UBound(intPoints)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str = "Intersection Point[" &amp; k &amp; "] is: " &amp; intPoints(j) &amp; "," &amp; intPoints(j + 1) &amp; "," &amp; intPoints(j + 2)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MsgBox str, , "IntersectWith Example"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str = ""<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; I = I + 2<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; j = j + 3<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; k = k + 1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next<BR>&nbsp;&nbsp;&nbsp; End If<BR>UserForm1.Show</P>
<P>End Sub<BR>提示错误如下:运行错误‘424’</P>
<P>在Set intPoints = lineObj.IntersectWith(circleObj, acExtendNone)行上标示错误,</P>
<P>版主帮忙看一下,怎么回事</P>

雪山飞狐_lzh 发表于 2006-4-19 13:34:00

intPoints = lineObj.IntersectWith(circleObj, acExtendNone)

matrix 发表于 2006-4-20 10:48:00

<P>现在又有一个新问题,想问一下,我是做了一个循环,先画线,选取一个曲线,然后求交点,删除原来的直线,重新画线,以原起点为起点,交点为端点,结果出错,程序如下:</P>
<P>Private Sub CommandButton1_Click()<BR>Dim angle As Double<BR>Dim p1 As Variant<BR>Dim p2(0 To 2) As Double<BR>Dim lineobj As AcadLine<BR>Dim lineobj2 As AcadLine<BR>Dim curveobj As AcadObject<BR>Dim intersectpoint As Variant '定义交点<BR>Dim temppt(0 To 2) As Double<BR>UserForm1.hide<BR>p1 = ThisDrawing.Utility.GetPoint(, "选取坝体上某一点")<BR>ThisDrawing.Utility.GetEntity curveobj, pickedpoint, "请选定曲线"<BR>For angle = 180 To 360 Step 5<BR>p2(0) = p1(0) + 100 * Cos(angle) '计算初始直线另一端点<BR>p2(1) = p1(1) + 100 * Sin(angle)<BR>p2(2) = p1(2)<BR>Set lineobj = ThisDrawing.ModelSpace.AddLine(p1, p2)<BR>intersectpoint = lineobj.IntersectWith(curveobj, acExtendthisEntity) '得到交点<BR>temppt(0) = intersectpoint(0)<BR>temppt(1) = intersectpoint(1)<BR>temppt(2) = 0<BR>lineobj.Delete<BR>Set lineobj = ThisDrawing.ModelSpace.AddLine(p1, temppt) '重新画线</P>
<P>lineobj.color = Int(255 * Rnd + 1)<BR>lineobj.Highlight True<BR>lineobj.Update</P>
<P>Next angle</P>
<P>UserForm1.Show</P>
<P>End Sub</P>
<P>结果:temp(0)=intersectpoint(0)上提示下标越界</P>
<P>问一下,怎么回事,应该怎么解决</P>

雪山飞狐_lzh 发表于 2006-4-20 14:53:00

<P>实体间没有交点时,IntersectWith函数返回上界为-3的数组,会出现这种情况,要先判断一下</P>

matrix 发表于 2006-4-20 20:16:00

<P>谢谢,回答,再问一个问题,如果在直线上选定一个点,能不能在选定点的同时,返回直线上的标注,同时如果有一个曲线与直线上标注的数字一样的话,选择该曲线,</P>
<P>版主提示一下,用什么方法,,</P>
<P>谢谢啦,听他们说好像不能,不知道你有没有什么高招,</P>
页: [1]
查看完整版本: 如何判断曲线与直线相交,怎么求出交点