| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1858 人关注过本帖
标题:求助:Circle 方法画出来的圆,其圆弧上的坐标点怎么计算?
取消只看楼主 加入收藏
William1949
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:111
专家分:0
注 册:2009-3-17
结帖率:63.64%
收藏
已结贴  问题点数:100 回复次数:4 
求助:Circle 方法画出来的圆,其圆弧上的坐标点怎么计算?
用 Circle 画一个半圆,颜色为黑色。
Picture1.Circle (90, 100), 80, vbBlack, 0, 3.14
图片附件: 游客没有浏览图片的权限,请 登录注册


然后,计算圆弧上的每个坐标点,再用:
Picture1.PSet (X1, Y1), vbRed
设置该点的像素颜色为红色。

理论上,图像上应该不会显示出黑色的圆弧(都被红色覆盖了),要是计算精确的话,红色也不会画在其它地方,只能画在原黑色轨迹上。

请问,我应该如何精确计算,使坐标点完全重合原先的黑色圆弧,(数学水平太差了,三角函数把我搞蒙了)

程序代码:
Private Sub Command1_Click()
'错误的计算过程
    Dim iColor      As Long, P          As Long, X1         As Long, Y1     As Long, Radius        As Long
    Dim CentrX      As Long, CentrY     As Long
    Dim Pi          As Double, Si       As Double, Co       As Double
    Dim Radian      As Double, Angle    As Double, ArcLen   As Double, Angle2 As Double
    
    Pi = 3.1415926
    With Picture1
        .Cls
        .BackColor = vbWhite
        .ScaleMode = vbPixels
    End With
    Radius = 80
    Angle = 180
    
    CentrX = 90
    CentrY = 100
    Picture1.Circle (CentrX, CentrY), Radius, vbBlack, 0, 3.14
    
    ArcLen = Angle * Pi * Radius / 180
    Angle2 = (180 * 1) / (Pi * Radius)
    ArcLen = Angle * Pi * Radius / 180
    For P = 0 To Int(ArcLen)
        Radian = (P * Angle2) * (Pi / 180)
        Si = Sin(Radian)
        Co = Cos(Radian)
        X1 = CentrX - Radius * Co
        Y1 = CentrY - Radius * Si
        If Picture1.Point(X1, Y1) = vbBlack Then iColor = vbRed Else iColor = vbGreen
        Picture1.PSet (X1, Y1), iColor
    Next
End Sub


图片附件: 游客没有浏览图片的权限,请 登录注册



[此贴子已经被作者于2022-9-8 16:39编辑过]

搜索更多相关主题的帖子: 坐标 计算 Long Dim Double 
2022-09-08 16:37
William1949
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:111
专家分:0
注 册:2009-3-17
收藏
得分:0 
老弟 你可真行!

要是你这么回答,那我只能把标题改改了。
原标题是:“... ... 圆弧上的坐标点怎么计算?”
改成:“怎么用 2 个 Circle 画2个圆,并使2个圆完全重合?”


假设一下,vb 没有提供 Circle 方法,api也没有画圆的函数,那你该怎么画出一个圆?
只给你提供:中心点坐标 和 半径。
难道你不用计算?不用三角函数?,不用诸如 Sin、Cos ...之类的函数?

你2楼的内容 通篇 读下来,只是 Circle 方法 的用法而已。

我真正想要的计算出来的 X,Y 坐标。


*********************************************
为了验证计算过程是否正确,我想了一办法:
把计算出来的 X,Y 坐标对应的像素,改成红色,并使一个一个像素都连起来 形成一个圆,然后与 Circle 方法画出的圆(1楼最上面的图)进行比对。

要是全红,说明计算是正确的。

事实上,我画出来的有误差,(1楼的图2)
有的地方是黑色,说明我没有覆盖到,
有的地方是绿色,说明我画偏了,

说白了,就是把 Circle 方法画出的圆 当做参照物。
而你却给了两个 Circle (1200, 1000), 750

真想坐地上大哭一场
2022-09-09 10:37
William1949
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:111
专家分:0
注 册:2009-3-17
收藏
得分:0 
或者 我这么问:
依照你发的图:

图片附件: 游客没有浏览图片的权限,请 登录注册


我测量圆周上某一坐标点,X = 117,Y = 33

请问:为什么是117,33,而不是116,32,也不是118,34
117,33,是怎么计算出来的?
2022-09-09 11:00
William1949
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:111
专家分:0
注 册:2009-3-17
收藏
得分:0 
方法2:貌似 和我一楼用的方法差不多,有所区别的地方是:我是以 弧长 作为循环周期  For P = 0 To Int(ArcLen) ,然后以一个像素的大小来计算弧度。
而你的是以 角度作为循环周期 for i=0 to 360 step 0.001,步长 0.001,
我测试方法2 发现 步长 越密,与 Circle 圆的重合度越好。改成0.1 效果就变差了。
此方法可借鉴一下,诚谢。


方法1:感觉好像看懂了,我可以把那 8 个点 到 圆心的距离统计出来,与半径相等的那个点,应该是最理想的点。不过要是研究此方法,就得另起炉灶了。抽时间在深度学习。

感谢!感谢!




2022-09-09 18:45
William1949
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:111
专家分:0
注 册:2009-3-17
收藏
得分:0 
终于完工了。
图片附件: 游客没有浏览图片的权限,请 登录注册

程序代码:
Private Type POINTAPI
    X       As Long
    Y       As Long
End Type

Private Sub CircleGradient(ByVal X As Long, ByVal Y As Long, ByVal Radius As Long, ByVal InnerRadius As Long, ByVal Angle As Long, ByVal StartAngle As Long, ByVal ColorStart As Long, ByVal ColorEnd As Long)
    Dim iR      As Long, P          As Long, i          As Long
    Dim Pi      As Double, Radian   As Double
    Dim sP      As Single
    Dim Po      As POINTAPI, oldPo  As POINTAPI, RePo() As POINTAPI
    Dim iColor() As Long
    
    Pi = 3.1415926
    ReDim RePo((Radius * 2 * Pi) * 2 - 1) As POINTAPI
    For iR = Radius To InnerRadius Step -1
        i = 0
        oldPo.X = X
        oldPo.Y = Y
        For sP = StartAngle To (StartAngle + Angle) Step 0.05 '0.01
            Radian = sP * (Pi / 180)
            Po.X = X - iR * Cos(Radian)
            Po.Y = Y - iR * Sin(Radian)
            If Po.X <> oldPo.X Or Po.Y <> oldPo.Y Then
                RePo(i) = Po
                i = i + 1
                oldPo = Po
            End If
        Next
        Call GetGradientColors(ColorStart, ColorEnd, i, iColor())
        For P = 0 To i - 1
            With RePo(P)
                Picture1.PSet (.X, .Y), iColor(P)
            End With
        Next
    Next
    Erase iColor(), RePo()
End Sub

Private Sub GetGradientColors(ByVal Color1 As Long, ByVal Color2 As Long, ByVal Step As Long, ByRef gColor() As Long)
    Dim UB      As Long, P          As Long
    Dim iRed    As Byte, iGreen     As Byte, iBlue  As Byte
    Dim aRGB1() As Byte, aRGB2()    As Byte
    Dim Sc      As Single, ScB      As Single
    
    Call GetRGB(Color1, aRGB1())
    Call GetRGB(Color2, aRGB2())
    
    UB = Step - 1
    ReDim gColor(UB) As Long
    For P = 0 To UB
        Sc = P / UB
        ScB = 1 - Sc
        iRed = aRGB2(0) * Sc + ScB * aRGB1(0)
        iGreen = aRGB2(1) * Sc + ScB * aRGB1(1)
        iBlue = aRGB2(2) * Sc + ScB * aRGB1(2)
        gColor(P) = (iBlue * &H10000 + iGreen * &H100& + iRed)
    Next
    Erase aRGB1(), aRGB2()
End Sub

Private Sub GetRGB(ByVal Color As Long, ByRef RGB() As Byte)
    ReDim RGB(2) As Byte
    RGB(0) = Color And &HFF                  'Red
    RGB(1) = (Color And &HFF00&) / &H100&    'Green
    RGB(2) = (Color And &HFF0000) / &H10000  'Blue
End Sub


接下来,再画几条刻度线,再画一个指针。就算齐活了
2022-09-15 14:22
快速回复:求助:Circle 方法画出来的圆,其圆弧上的坐标点怎么计算?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018042 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved