ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 8770|回复: 24

[求助] 给定任意三点,画弧线

[复制链接]

TA的精华主题

TA的得分主题

发表于 2017-6-2 07:32 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
给定任意三点坐标,比如A(x1,y1)、B(x2,y2)、C(x3,y3),能否画一段弧线?
两种情况:
1、三点在同一条线上,三点共线,不能画弧。怎么判断在同一条线上?
2、其中一点到另两点的距离相等,则该点为圆心,另两点在圆弧上。即三点连线为等腰三角形或为等边三角形,其中某点为圆心,另两点在圆弧上。
3、第1种情况外,三点共圆,所以三点都可以在圆弧上。
本人技术太差,写了两个函数,就写不下去了,麻烦各位大侠帮忙。
  1. Function distance(ByVal d1 As Single, ByVal d2 As Single, ByVal d3 As Single, ByVal d4 As Single) '两点距离
  2.     Sl = (d3 - d1) ^ 2 + (d4 - d2) ^ 2
  3.     If Sl > 0 Then
  4.         distance = Sqr(Sl)
  5.     End If
  6. End Function

  7. Function midvertical(ByVal d1 As Single, ByVal d2 As Single, ByVal d3 As Single, ByVal d4 As Single) '两点中垂线方程
  8.     Dim dx0 As Single
  9.     Dim dy0 As Single
  10.     Dim k As Single
  11.     Dim k1 As Single
  12.     Dim x As Single
  13.     Dim y As Single
  14.     dx0 = (d1 + d3) / 2: dy0 = (d2 + d4) / 2 '中点坐标
  15.     k = (d4 - d2) / (d3 - d1) '直线斜率
  16.     k1 = -k
  17.     y -dy0 = -k * (x - dx0)
  18.     y = -k * (x - dx0) + dy0
  19.     midvertical = y
  20. End Function
复制代码
中垂线方程函数问题较多,烦请各位,谢谢。
  1. Sub Macro1()
  2.     Set shp = ActiveSheet.Shapes.AddShape(msoShapeArc, X, Y, r, r)
  3. End Sub
复制代码


TA的精华主题

TA的得分主题

发表于 2017-6-2 11:21 | 显示全部楼层
看似简单的问题,写起来也颇为不容易。
1,先要证明三点不共线:
求得任意2点的直线方程,代入第3点坐标,不等于0即可;
2,求得AB线的垂直平分线方程;
求得BC线的垂直平分线方程;
求两条垂直线的交点坐标,即为圆心坐标
3,根据圆弧参数画弧线。

TA的精华主题

TA的得分主题

发表于 2017-6-2 13:02 | 显示全部楼层
本帖最后由 Moneky 于 2017-6-3 11:30 编辑

一个简单例子,没有判断是否共线,如果要判断可以根据斜率判断,不难完成。也没有判断三点在圆弧上的顺序(还没有好想法)
说明:需要在窗体上按逆时针的方向点出三个点,然后再点击按钮。





demo2.gif

vba-api-画图-过三点的弧.rar

212.64 KB, 下载次数: 79

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-6-2 14:38 | 显示全部楼层
Moneky 发表于 2017-6-2 13:02
一个简单例子,没有判断是否共线,如果要判断可以根据斜率判断,不难完成。也没有判断三点在圆弧上的顺序( ...

大师的技术真高,你这不只给定三点,而是任意三点,谢谢,谢谢。
我写了一些,还是写不下去了。
  1. Private Sub test()
  2.     On Error Resume Next
  3.     X1 = 100: Y1 = 150
  4.     X2 = 100: Y2 = 280
  5.     X3 = 150: Y3 = 150
  6.    
  7.     k1 = (Y1 - Y2) / (X1 - X2) '直线斜率
  8.     If k1 = "" Then
  9.         b1 = (Y2 + Y1) / 2
  10.     Else
  11.         b1 = Y1 - k1 * X1 '直线方程
  12.     End If
  13.     dx1 = (X1 + X2) / 2: dy1 = (Y1 + Y2) / 2 '中点坐标
  14.     d1 = dy1 - k1 * dx1 '两点中垂线方程
  15.    
  16.     k2 = (Y2 - Y3) / (X2 - X3)
  17.     If k2 = "" Then
  18.         b2 = (Y2 + Y3) / 2
  19.     Else
  20.         b2 = Y2 - k2 * X2
  21.     End If
  22.     dx2 = (X2 + X3) / 2: dy2 = (Y2 + Y3) / 2
  23.     d2 = dy2 - k2 * dx2
  24.    
  25.     k3 = (Y3 - Y1) / (X3 - X1)
  26.     If k3 = "" Then
  27.         b3 = (Y3 + Y1) / 2
  28.     Else
  29.         b3 = Y3 - k3 * X3
  30.     End If
  31.     dx3 = (X3 + X1) / 2: dy3 = (Y3 + Y1) / 2
  32.     d3 = dy3 - k3 * dx3
  33.    
  34.     dx0 = (b1 - b2) / (k2 - k1) '计算圆心坐标
  35.     dy0 = k1 * dx0 + b1
  36.     r = Sqr((X1 - dx0) ^ 2 + (Y1 - dy0) ^ 2) '计算圆心半径
  37.     X = dx0 + r '从哪点画呢?
  38.     Y = dy0 + r
  39.     Set shp = ActivePresentation.Slides(1).Shapes.AddShape(msoShapeArc, X, Y, r, r)
  40.     't1 = acos(((X1 - dx0) * (X2 - dx0) + (Y1 - dy0) * (Y2 - dy0)) / (r * r))
  41.     't2 = acos(((X1 - dx0) * (X3 - dx0) + (Y1 - dy0) * (Y3 - dy0)) / (r * r))
  42.     'shp.Adjustments.Item(1) = t1 '修正弧线开始位置
  43.     'shp.Adjustments.Item(2) = t2 '修正弧线结束位置   
  44. End Sub
复制代码

不知道,起点和终点。

TA的精华主题

TA的得分主题

发表于 2017-6-2 15:22 | 显示全部楼层
dongdonggege 发表于 2017-6-2 14:38
大师的技术真高,你这不只给定三点,而是任意三点,谢谢,谢谢。
我写了一些,还是写不下去了。

根据线段的转向来确定起点和终点。
demo2.gif

vba-api-画图-过三点的弧.rar

23.97 KB, 下载次数: 46

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-6-2 15:33 | 显示全部楼层
Moneky 发表于 2017-6-2 15:22
根据线段的转向来确定起点和终点。

修改后的程序确实能判断起点、终点了,再次谢谢大师,大师辛苦了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-6-2 15:44 | 显示全部楼层
Moneky 发表于 2017-6-2 15:22
根据线段的转向来确定起点和终点。

大师,当三点接近一条直线时,getO函数的getO.X就出现错误。这是否加个判断。

TA的精华主题

TA的得分主题

发表于 2017-6-2 15:56 | 显示全部楼层
dongdonggege 发表于 2017-6-2 15:44
大师,当三点接近一条直线时,getO函数的getO.X就出现错误。这是否加个判断。

gxLine 函数已经写在里面了,自己加工吧。没有难度

TA的精华主题

TA的得分主题

发表于 2017-6-2 16:22 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
看到你的题目感觉挺有趣,研究了下,也不知道对不对,发上来交流下,也希望前辈们能够指点指点。

三点画弧线.rar

26.91 KB, 下载次数: 35

1

TA的精华主题

TA的得分主题

发表于 2017-6-2 16:28 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Moneky 发表于 2017-6-2 13:02
一个简单例子,没有判断是否共线,如果要判断可以根据斜率判断,不难完成。也没有判断三点在圆弧上的顺序( ...

( ⊙o⊙ )哇,太好了,下载下来好好学习下
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-24 08:12 , Processed in 0.039426 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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