2015-04-20 28 views
0

我想创建基于中心点(我已经有中心点)的时钟手坐标。这里是我到目前为止的代码:创建基于偏离中心点的时钟手坐标

我有我的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的配方是什么。让我知道你是否需要任何额外的信息,谢谢。

+4

你对三角函数有什么了解?如果你有角度,那么计算'X = length * sin(angle)+ centerPt.X; Y =长度* cos(角度)+ centerPt.Y;'在3D中明显更复杂一点(但想法相同):[维基救援](https://en.wikipedia.org/wiki/) Rotation_(数学)#Three_dimensions) – Carsten

+0

@CarstenKönig非常感谢,这就是我一直在寻找的东西。不熟悉数学知道这从我的头顶,但正确的方向我都准备好了。再次感谢你,你应该让这个答案,所以你得到信用。 – Joe

+0

没问题 - 其他答案是一样的 - 我得到了我需要的所有代表(没有更多的里程碑获得,而且我也永远不会成为J. Skeet) - 只需选择最好的答案(接受)并接受它即可 – Carsten

回答

1

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

让我们假设你已经采取了三角法并且知道unit circle的公式。

偏移x和y想要的公式可以根据时钟的角度来确定(我们将其称为theta)。由于有12个小时,并且360度为一圈,所以theta = hours * 360/12。然后就可以得到:

X = 1.5 * SIN(THETA)

Y = -1.5 * cos(theta)

+1

Be当然,使用.Net Trig函数将角度转换为弧度。 –

+0

@ChrisDunaway,我故意指定我没有给出真正的代码,但是,这是.NET实现的一个重要注意事项。 –

+0

哟埃里克我试图upvote这个,但它说我没有足够的声誉。非常感谢,这和以前的评论是我正在寻找! – Joe

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 div的你的时间来完成,并与360°

function getAngleForTime(ByVal time as Integer) as Single 
    Dim scale = time/12 
    return scale * 360 
end function 

MULT它这个功能使时间为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 

我希望这对你有帮助。我没有视觉工作室来测试这个代码。请将此代码适用于您的示例。对不起,我的坏结局。

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