找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: informore

[求助]:已知二点和半径,怎么画圆??

[复制链接]
发表于 2004-6-14 19:12:03 | 显示全部楼层
能不能请斑主写一个lisp程序出来呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-6-15 09:56:28 | 显示全部楼层
可不可以把那两点看成是切点,然后用相切相切半径画圆???
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-6-15 09:59:07 | 显示全部楼层
点是切点,那切线是什么呢?
你要是用相切捕捉根本就捕捉不到点的!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-6-15 10:11:22 | 显示全部楼层
二楼的方法不错
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-6-15 13:34:24 | 显示全部楼层
看来还是没有什么简洁的办法....
郁闷
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-6-15 16:22:30 | 显示全部楼层
已知两点和半径理论上是有两个解的,如果两点刚好是在直径上则只有一个解,所以应该还要有圆心方向
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-6-15 16:45:42 | 显示全部楼层
提供一种绘图思路:三点画圆
假设有AB两点,先做过A点的垂线,然后以B点为圆心,2r为半径画圆,与过A点的垂线相交两点,然后分别过这两点,利用三点画圆,可做出过AB的两个圆,满足题目要求。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-6-15 18:36:05 | 显示全部楼层
嗯.我发觉二楼的方法不错..... 但是13楼有道理
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-6-15 19:06:35 | 显示全部楼层
根据2楼的思路,写了这个程序,圆方向无法判断,所以生成两个圆,不要的圆楼主就手工删除掉,:)

Option Explicit

Sub addcircle()
Dim rads As Double
Dim intpnts As Variant
rads = InputBox("输入圆半径")
Dim sset As AcadSelectionSet
Dim circleobj(1) As AcadCircle
Dim p1(0 To 2) As Double
Dim p2(0 To 2) As Double
Dim i As Integer
Set sset = ThisDrawing.SelectionSets.Add("c1c")
sset.SelectOnScreen


For i = 0 To 1
Set circleobj(i) = ThisDrawing.ModelSpace.addcircle(sset.Item(i).Coordinates, rads)

Next
intpnts = circleobj(0).IntersectWith(circleobj(1), acExtendNone)
circleobj(0).Delete
circleobj(1).Delete


p1(0) = intpnts(0): p1(1) = intpnts(1): p1(2) = intpnts(2)

p2(0) = intpnts(3): p2(1) = intpnts(4): p2(2) = intpnts(5)
Set circleobj(0) = ThisDrawing.ModelSpace.addcircle(p1, rads)

Set circleobj(1) = ThisDrawing.ModelSpace.addcircle(p2, rads)
sset.Delete
End Sub
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-6-15 19:35:33 | 显示全部楼层
我也来写一个lisp
可以选择方向!

[PHP]
(defun c:c2()
  (setq pt1 (getpoint "第一点: ")
        pt2 (getpoint "第二点: ")
        r (getreal "半径: ")
        pt3 (getpoint "方向: "))
  (setq os (getvar "osmode"))
  (setvar "osmode" 0)
  (setq a (angle pt1 pt2)
        d (distance pt1 pt2)
        dd (/ d 2)
        ll (sqrt (- (* r r) (* dd dd)))       
        a2 (atan ll dd)
        a1 (angle pt1 pt3)
        )  
  (if (<= a pi)
    (progn
      (if (and (> a1 a) (< a1 (+ a pi)))
        (setq aa (+ a a2))
        (setq aa (- a a2))))
    (progn
      (if (and (< a1 a) (> a1 (- a pi)))
        (setq aa (- a a2))
        (setq aa (+ a a2))))
    )
  (setq pc (polar pt1 aa r))
  (command "CIRCLE" pc r)
  (setvar "osmode" os)
  )
[/PHP]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-6-16 21:00:47 | 显示全部楼层
加了选择方向功能,用的是笨办法,呵呵

Option Explicit

Sub addcircle()
On Error Resume Next
Dim rads As Double
Dim intpnts As Variant
rads = InputBox("输入圆半径")
Dim sset As AcadSelectionSet
Dim circleobj(1) As AcadCircle
Dim p1(0 To 2) As Double
Dim p2(0 To 2) As Double
Dim i As Integer
Dim fxd As Variant
Dim Lobj As AcadLine
Dim Tobj As AcadLine
Dim TMP As Variant
Set sset = ThisDrawing.SelectionSets.Add("c112c")
sset.SelectOnScreen
fxd = ThisDrawing.Utility.GetPoint(, "请选择方向点")
For i = 0 To 1
    Set circleobj(i) = ThisDrawing.ModelSpace.addcircle(sset.Item(i).Coordinates, rads)
Next
intpnts = circleobj(0).IntersectWith(circleobj(1), acExtendNone)
circleobj(0).Delete
circleobj(1).Delete
p1(0) = intpnts(0): p1(1) = intpnts(1): p1(2) = intpnts(2)
p2(0) = intpnts(3): p2(1) = intpnts(4): p2(2) = intpnts(5)
Set Tobj = ThisDrawing.ModelSpace.AddLine(fxd, p1)
Set Lobj = ThisDrawing.ModelSpace.AddLine(p1, p2)
TMP = Tobj.IntersectWith(Lobj, acExtendNone)
If UBound(TMP) = 0 Then
    Set circleobj(0) = ThisDrawing.ModelSpace.addcircle(p2, rads)
Else
    Set circleobj(1) = ThisDrawing.ModelSpace.addcircle(p1, rads)
End If
Tobj.Delete
Lobj.Delete
sset.Delete
End Sub
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-13 04:13 , Processed in 0.282716 second(s), 45 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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