Avatar billede thomasfricke Juniormester
01. maj 2011 - 20:57 Der er 8 kommentarer

Speedometer VB 2010

Ville prøve at lave et speedometer til bil, men har ingen anelse om hvordan jeg gør. Har ledt lidt efter en guide til sin/cos ur, men har kun fundet til VB6... Er der nogen der kan hjælpe med at lave analoge visere???
Avatar billede arne_v Ekspert
02. maj 2011 - 04:14 #1
Til inspiration:

Imports System
Imports System.Drawing
Imports System.Windows.Forms

Public Class MainForm
    Inherits Form
    Private Const MAX_SPEED As Integer = 200
    Private speed As Integer
    Private speedshow As PictureBox
    Private up As Button
    Private down As Button
    Public Sub New()
        speed = 0
        speedshow = New PictureBox()
        up = New Button()
        down = New Button()
        SuspendLayout()
        speedshow.Location = New Point(50, 50)
        speedshow.Size = New Size(300, 300)
        speedshow.BorderStyle = BorderStyle.FixedSingle
        AddHandler speedshow.Paint, AddressOf ShowPaint
        up.Location = New Point(50, 400)
        up.Size = New Size(150, 50)
        up.Text = "Speed up"
        AddHandler up.Click, AddressOf UpClick
        down.Location = New Point(200, 400)
        down.Size = New Size(150, 50)
        down.Text = "Speed down"
        AddHandler down.Click, AddressOf DownClick
        ClientSize = New Size(400, 500)
        Controls.Add(speedshow)
        Controls.Add(up)
        Controls.Add(down)
        Text = "Speedometer"
        ResumeLayout(False)
    End Sub
    Private Sub UpClick(sender As Object, e As EventArgs)
        speed = Math.Min(MAX_SPEED, speed + 10)
        speedshow.Invalidate()
    End Sub
    Private Sub DownClick(sender As Object, e As EventArgs)
        speed = Math.Max(0, speed - 10)
        speedshow.Invalidate()
    End Sub
    Private Sub ShowPaint(sender As Object, e As PaintEventArgs)
        e.Graphics.FillPie(New SolidBrush(Color.Gray), 25, 100, 250, 250, 180, 180)
        e.Graphics.DrawLine(New Pen(Color.Red, 5), 150, 225, CSng(150 + 125 * Math.Cos(speed * Math.PI / MAX_SPEED)), CSng(225 - 125 * Math.Sin(speed * Math.PI / MAX_SPEED)))
    End Sub
    <STAThread> _
    Public Shared Sub Main(args As String())
        Application.Run(New MainForm())
    End Sub
End Class
Avatar billede thomasfricke Juniormester
02. maj 2011 - 20:34 #2
Har fået lavet dette modul: Skrevet til vb6, har prøvet at rette til vb2010. Så der er nok fejl i...
################################################
Module Module1
    Public Structure POINT
        Friend X As Object
        Friend Y As Object

    End Structure

    Public P As POINT

    Public tSine(3599) As Single
    Public tCoSine(3599) As Single

    Public Sub LoadTables()
        Dim i As Long

        For i = 0 To 3599
            tSine(i) = Math.Sin(D2R(i / 10))
            tCoSine(i) = Math.Cos(D2R(i / 10))
        Next i
    End Sub

    Public Function Sine(ByVal Angle As Long) As Single
        If Angle < 0 Then Angle = 360 + (Angle Mod 360)
        If Angle > 359 Then Angle = Angle Mod 360

        Sine = tSine(Angle)
    End Function

    Public Function CoSine(ByVal Angle As Long) As Single
        If Angle < 0 Then Angle = 360 + (Angle Mod 360)
        If Angle > 359 Then Angle = Angle Mod 360

        CoSine = tCoSine(Angle)
    End Function


    Public Function D2R(ByVal Angle As Single) As Single
        D2R = Angle / 180 * Math.PI
    End Function

    Public Function RotatePoint(ByRef pPoint As POINT, ByRef pOrigin As POINT, ByVal Degrees As Single) As POINT
        RotatePoint.X = pOrigin.X + CoSine(Degrees) * (pPoint.X - pOrigin.X) - Sine(Degrees) * (pPoint.Y - pOrigin.Y)
        RotatePoint.Y = pOrigin.Y + Sine(Degrees) * (pPoint.X - pOrigin.X) + CoSine(Degrees) * (pPoint.Y - pOrigin.Y)
    End Function

End Module
################################################



Så står der i guiden: Hvordan går jeg det ???
################################################

Create a function called LoadTables, and add this:

Public Sub LoadTables()
  Dim i As Long

  For i = 0 To 3599
    tSine(i) = Sin(D2R(i / 10))
    tCoSine(i) = Cos(D2R(i / 10))
  Next i
End Sub
################################################



Og så her til sidst ;)
Hvordan bruger jeg så denne formel :P
Avatar billede thomasfricke Juniormester
03. maj 2011 - 23:29 #3
Er der ingen der kan hjælpe mig, skriv gerne hvis i mangler oplysninger...
Avatar billede arne_v Ekspert
03. maj 2011 - 23:35 #4
Du fik en loesning og du har ikke engang kommenteret paa den.
Avatar billede thomasfricke Juniormester
03. maj 2011 - 23:49 #5
arne_v:
Troede du forstod på mit indlæg, at det er i stil med den guide jeg har fundet jeg godt kunne tænke mig...

Vil gerne kunne bruge "lineshape", således at y2, x2 står fast. Og senere bygge videre så det er x1,x2,y1,y2 som flytter sig...
Avatar billede arne_v Ekspert
04. maj 2011 - 03:15 #6
Du behoever kun 2 linier for at lave det.

Du kan naturligvis godt skrive 200 linier for at goere det samme.

Men .....
Avatar billede thomasfricke Juniormester
04. maj 2011 - 11:54 #7
arne_v:

Jamen, må jeg så be om kode... ???
Eller evt. forklaring og rettelse på den jeg selv har fundet...
Avatar billede arne_v Ekspert
25. juni 2011 - 04:23 #8
Der er postet kode.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester