基于偏心点创建时钟指针坐标

时间:2015-04-20 13:16:23

标签: c# vb.net

我正在尝试根据中心点创建钟针坐标(我已经有中心点)。这是我到目前为止的代码:

我在VB.NET表单上的内容:

http://i58.tinypic.com/3ehwl.png

Private Sub CreateClockPoints(ByVal centerPt As VISIPoint)
        Dim vPtD As New VISIPoint

        If rbn1.Checked Then
            vPtD.Put(centerPt.X, centerPt.Y + Util.convertVal(1.5, 1, 2), centerPt.Z)
        ElseIf rbn2.Checked Then
            vPtD.Put(centerPt.X, centerPt.Y, centerPt.Z)
        ElseIf rbn3.Checked Then
            vPtD.Put(centerPt.X, centerPt.Y, centerPt.Z)
        ElseIf rbn4.Checked Then
            vPtD.Put(centerPt.X + Util.convertVal(1.5, 1, 2), centerPt.Y, centerPt.Z)
        ElseIf rbn5.Checked Then
            vPtD.Put(centerPt.X, centerPt.Y, centerPt.Z)
        ElseIf rbn6.Checked Then
            vPtD.Put(centerPt.X, centerPt.Y, centerPt.Z)
        ElseIf rbn7.Checked Then
            vPtD.Put(centerPt.X, centerPt.Y - Util.convertVal(1.5, 1, 2), centerPt.Z)
        ElseIf rbn8.Checked Then
            vPtD.Put(centerPt.X, centerPt.Y, centerPt.Z)
        ElseIf rbn9.Checked Then
            vPtD.Put(centerPt.X, centerPt.Y, centerPt.Z)
        ElseIf rbn10.Checked Then
            vPtD.Put(centerPt.X - Util.convertVal(1.5, 1, 2), centerPt.Y, centerPt.Z)
        ElseIf rbn11.Checked Then
            vPtD.Put(centerPt.X, centerPt.Y, centerPt.Z)
        ElseIf rbn12.Checked Then
            vPtD.Put(centerPt.X, centerPt.Y, centerPt.Z)
        End If

    End Sub

从中心到时钟点的距离必须为1.5。

如你所见,我已经知道了1个,4个,7个和10个。我不确定2,3,5,6,8,9,11和12的公式是什么。如果您需要任何其他信息,请告诉我,谢谢。

3 个答案:

答案 0 :(得分:1)

这看起来像是家庭作业,所以我会破坏一些答案,我不会给你实际的代码。

让我们假设您已经采用三角学并知道unit circle的公式。

您想要的偏移x和y的公式可以从时钟指针的角度确定(我们称之为theta)。由于有一个圆圈有12小时和360度,theta = hours * 360 / 12。然后你就可以得到:

  

x = 1.5 * sin(theta)

  

y = -1.5 * cos(theta)

答案 1 :(得分:0)

正常时钟顶部应为12,底部应为6。

要获取像素的坐标,您可以使用旋转matrix将矢量从0°旋转到359°

<强>!这不是真正的vb.net代码!

function rotate(ByVal p as Point2D,ByVal angle as Single) as Point2D
    Single X = p.X * cos(angle) - p.Y * sin(angle)
    Single Y = p.X * sin(angle) + p.Y * cos(angle)
    return new Point2D(X,Y)
end function

小心,旋转矩阵将逆时针旋转,因此您应该否定角度。您应该在角度(以度为单位)和时间之间创建某种映射

这可以通过将您的时间除以12而将其与360°

进行比较来完成
function getAngleForTime(ByVal time as Integer) as Single
    Dim scale = time / 12
    return scale * 360
end function

此功能可使12:00至360°和3:00至90°

现在您可以旋转长度为1.5的矢量:

Dim time as Integer = 4
Dim angle as Single = getAngleForTime(time)
Dim p as new Point2D(1.5,0)
Dim p_r as Point2D = rotate(p, -angle) 'use negative angle here !

现在你有一个旋转的矢量。要获得点的最终坐标,您必须将中心点的坐标添加到矢量:

Dim final_point as Point2D
final_point.X = p_r.X + center_point.X
final_point.Y = p_r.Y + center_point.Y

我希望这会对你有所帮助。我没有可视化工作室来测试这段代码。请根据您的示例调整此代码。对不起我的不好意思。

答案 2 :(得分:0)

您需要使用一些基本的Trig来确定X,Y坐标。鉴于有12个时钟点,您可以使用此功能确定时钟上任何点的X,Y坐标。请注意,这将返回标准笛卡尔平面的X,Y坐标。您必须转换为.Net坐标系才能进行绘图。

'Returns the X,Y coordinate of a point on a clock given a center point and radius.  
'Clock point 0 = 12:00, 1 = 1:00, etc.
Private Function getClockPoint(center As PointF, radius As Double, clockPoint As Integer) As PointF
    Dim angle As Double = clockPoint * (2.0 * Math.PI) / 12.0

    Dim x As Single = center.X + CSng(radius * Math.Sin(angle))
    Dim y As Single = center.Y + CSng(radius * Math.Cos(angle))

    Return New PointF(x, y)
End Function