Изменять координаты (x или y) на числа меньше единицы - Visual Basic .NET

Формулировка задачи:

Например, если мы введём команду
PictureBox1.Location = New Point(PictureBox1.Location.X + 0.5, PictureBox1.Location.Y - 1)
То PictureBox сдвинется с места наверх, но вправо не пойдёт(даже если зациклить) Вот у меня такая же проблема с тригонометрическими функциями:
Private Sub calc_pos_lines_and_dots()              
        Dim opr As New Bitmap(GB.Image)
        gdot1.Location = New Point(laserpb.Location.X + (laserpb.Size.Width / 2), laserpb.Location.Y + (laserpb.Size.Height / 2))
        pixe = opr.GetPixel(0, 0)
        getgrad = ((90 - ((dir2) * -1)) * Pi) / 180
        vel6 = Math.Sin(getgrad) * 10
        vel7 = Math.Cos(getgrad) * 10
        While pixe <> opr.GetPixel(gdot1.Location.X - GB.Location.X, gdot1.Location.Y - GB.Location.Y)
           
            gdot1.Location = New Point(gdot1.Location.X + vel6, gdot1.Location.Y - vel7)
 
 
        End While
        xglav = gdot1.Location.X - GB.Location.X
        yglav = gdot1.Location.Y - GB.Location.Y
        GB.Refresh()
    End Sub
Эта процедура рисует линию (наклонённую по розе ветров например на 45 градусов(0 верх, 90 право) от точки до бортика. Но проблема в том что нам приходится умножать синус и косинус на 10, а если мы умножаем синус или косинус на 10, то во-первых за один проход по циклу координаты x и y изменяются со слишком большим интервалом, что и может привести к тому, что точка может проскочить бортик(во вложении видео) во-вторых, т.к. число double переводится в integer... вообщем я точно не могу объяснить дельным языком, я ещё не проходил тригонометрические функции, но я думаю если посмотреть на гифку, то будет понятно, что если бы в смещении по координатам учитывались хотя-бы 2-3 знака после запятой, то не было бы такого резкого перехода. Может кто знает как решить данную проблему. Дам плюсиков сколько смогу))

Код к задаче: «Изменять координаты (x или y) на числа меньше единицы - Visual Basic .NET»

textual
Option Strict On
 
Public Class Form1
    Private pbGreen As PictureBox
 
    Private pbRed As PictureBox
    Private pbRedLoc As PointF
 
    Private Timer1 As Timer
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Size = New Size(300, 300)
 
        pbGreen = New PictureBox With {.Location = New Point(10, 0), _
                                    .Size = New Size(10, 10), _
                                    .BackColor = Color.Green}
        Me.Controls.Add(pbGreen)
 
        pbRed = New PictureBox With {.Location = New Point(0, 10), _
                                    .Size = New Size(10, 10), _
                                    .BackColor = Color.Red}
        Me.Controls.Add(pbRed)
 
        Timer1 = New Timer With {.Interval = 50, .Enabled = True}
        AddHandler Timer1.Tick, AddressOf Timer1_Tick
    End Sub
 
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs)
        pbGreen.Location = New Point(CInt(pbGreen.Location.X + 0.5), pbGreen.Location.Y + 1)
 
        pbRedLoc = PointF.Add(pbRedLoc, New SizeF(0.5, 1))
        pbRed.Location = Point.Ceiling(pbRedLoc)
 
        If pbGreen.Location.Y > Me.ClientRectangle.Height - 20 Then Timer1.Stop()
    End Sub
End Class

6   голосов, оценка 4.000 из 5


СОХРАНИТЬ ССЫЛКУ
Похожие ответы