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

  1. Например, если мы введём команду vb.net1 PictureBox1.Location = New Point(PictureBox1.Location.X + 0.5, PictureBox1.Location.Y - 1)То PictureBox сдвинется с места наверх, но вправо не пойдёт(даже если зациклить) Вот у меня такая же проблема с тригонометрическими функциями:vb.net1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 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 знака после запятой, то не было бы такого резкого перехода. Может кто знает как решить данную проблему. Дам плюсиков сколько смогу))


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


Похожие ответы
  1. Добрый день!Подскажите пожалуйста как в PictureBox при помощи TrackBar изменять цвет картинки.Например как в фотошопе "Цветовой баланс" и "Яркость\Контрастность".В Visual Basic 2010

  1. Вроде тривиальная задача поставила меня в тупик. Нужно в процессе работы программы изменять PictureBox.image Суть в том, что есть картинки которые лежат в My.Resources и надо в зависимости параметров цеплять соответствующую картинку. Если делать это применительно к одному объекту, то нет проблем Me.PictureBox1=My.Resources.image_1 Но как сделать это для группы объектов?vb.net1 2 3 4 5 For i As Integer =1 To 50     With Me.Controls("PictureBox" & i)          .image = My.Resources.image_1     End With NextПробовал так - не сработало Ругается что свойство image не является членом controls.vb.net1 2 3 4 5 For Each Pic As Control In Me.Controls      If TypeOf Pic Is PictureBox Then          Pic.image = My.Resources.image_1      End If NextТак тоже не хочет работать. Может кто подсказать как это сделать?Добавлено через 1 час 53 минуты Все, разобрался. Можно закрывать тему.

  1. Добрый день. Подскажите, пожалуйста, как правильно осуществить и (или) в каком направлении двигаться. Есть текстовый файл - из него идет заполнение ComboBox (построчно). Как сделать так, что бы пользователь не мог открыть этот файл и что-то там изменить. Может использовать какое-то свое расширение, файл, или что-то еще? В последствии данные в этом файле могут меняться местами, заменяться на другие и т.д.

  1. Всем привет! Создал свой простенький контрол, и хочу сделать так, чтобы он мог изменять только ширину, как у Textbox когда он находится в однострочном режиме. То есть отсутствовали ползунки/зацепки для изменения высоты как в режиме Locked = true.

  1. Доброго времени суток Подскажите как узнать координаты X2 и Y2 на протяжении всей длинны отрезка в Listbox Зная длинну данного отрезка , координаты начала отрезка X1 и Y1 и координаты конца отрезка... Заранее благодарен...

  1. Всем привет Просьба подсказать Есть форма, на ней DataGridView1 нужно при изменении размеров формы изменять ширину DataGridView1 и столбцов, на vb6 это делается просто в событии resize, в net чет выскакивает ошибка рекурсии, как с этим боротся???vb.net1 2 3  Private Sub Form1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize     DataGridView1.Columns(0).Width = 200  End SubДобавлено через 38 минут Пробовал так в ресайзе формыvb.net1 DataGridView1.Columns.Item(0).Width = Me.Width / 4ошибка: A first chance exception of type 'System.ArgumentOutOfRangeException' occurred in mscorlib.dll Добавлено через 13 минут Попробовал и такой вариант - ВСЕ не работает в модулеvb.net1 Public frm1 As Form1 = New Form1()в формеvb.net1 2 3 4 5 6     Private Sub Form1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize         'DataGridView1.Columns.Item(0).Width = Me.Width / 4         Dim w As Integer         w = frm1.Width         DataGridView1.Width = w     End Sub Люди помогите !!!

  1. Код строит геометрическую фигуру. координаты фигуры заданы таким образом vb.net1 2 3 4   e.Graphics.TranslateTransform( _             Me.ClientRectangle.Width \ 2, _             Me.ClientRectangle.Height \ 2, _             MatrixOrder.Append) Как задавать координаты форматом (200,150)?vb.net1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Imports System.Drawing Imports System.Drawing.Drawing2D Imports System.Windows.Forms   Public Class Form1     Inherits System.Windows.Forms.Form       Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)         e.Graphics.ScaleTransform(90, 90, MatrixOrder.Append)           e.Graphics.TranslateTransform( _             Me.ClientRectangle.Width \ 2, _             Me.ClientRectangle.Height \ 2, _             MatrixOrder.Append)           For i As Integer = 1 To 100 Step 5             e.Graphics.RotateTransform(5, MatrixOrder.Prepend)             e.Graphics.DrawRectangle(New Pen(Color.Blue, 0), -1, -1, 2, 2)         Next i     End Sub End Class

  1. Задание дали, получать координаты мышки на форме, используя api функцию в нэте нашёл 6.0 код, переделал что мог на 10,но не работаетvb.net1 2 3 4 5 6 7 8 9 10 11 12 13 Public Class Form1     Declare Function GetCursorPos Lib "user32" Alias "GetCursorPos" (ByVal lpPoint As POINTAPI) As Long     Structure POINTAPI         Dim x As Long         Dim y As Long     End Structure     Dim rect As POINTAPI     Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick         Call GetCursorPos(rect)         Label1.Text =         Label2.Text =     End Sub End Classпомогите доделать:O

  1. Вообщем что нужно, что бы когда я 2 раз нажимаю на кнопку она перемещалась в исходное положение ...vb.net1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23     Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click         Button4.Location = New Point(1292, 566)         Button4.Text = "Переместилось"       End Sub       Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click         Button1.Location = New Point(-1, 0)         Button1.Text = "Переместилось"       End Sub       Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click         Button2.Location = New Point(0, 568)         Button2.Text = "Переместилось"       End Sub       Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click         Button3.Location = New Point(1303, 0)         Button3.Text = "Переместилось"       End Sub