Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 14.04.2013
Сообщений: 3

Нарисовать прямоугольний треугольник. Прошу направить на путь истинный

14.04.2013, 14:01. Показов 1377. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день(утро, вечер).
В универе делаю лабораторную на тему 'Изучение методов и свойств объектов Bitmap'. Задание следующее: Вывести прямоугольный треугольник. Вроде бы ничего сложного, но столкнулся с такой проблемой: один из отрезков, тот что наклонный, уползает то вних то вверх, никак не могу победить...Направьте на путь истинный)))
координаты треугольника - это координаты верхней левой точки. Катеты - это катеты))

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
Imports System.Drawing
Imports System.Drawing.Imaging
 
Public Class Form1
    Dim BMP As Bitmap
 
    Private Sub DrawLine(ByRef bm As Bitmap, ByVal X1 As Integer, ByVal Y1 As Integer, ByVal X2 As Integer, ByVal Y2 As Integer, ByVal C As Color)
        Dim y As Integer
 
        If X1 = X2 Then
            For i As Integer = Y1 To Y2
                bm.SetPixel(X1, i, C)
            Next
        ElseIf Y1 = Y2 Then
            For i As Integer = X1 To X2
                bm.SetPixel(i, Y1, C)
            Next
        Else
            For i As Integer = X1 To X2
                y = ((Y2 - Y1) / (X2 - X1) * i) + Y1
                bm.SetPixel(i, y, C)
            Next
        End If
    End Sub
 
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim bm As New Bitmap(PictureBox1.Width, PictureBox1.Height)
        BMP = bm
    End Sub
 
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim X1, X2, Y1, Y2 As Integer
 
        X1 = Xtext.Text
        Y1 = Ytext.Text
        X2 = X1 + Wtext.Text
        Y2 = Y1 + Htext.Text
 
        DrawLine(BMP, X1, Y1, X2, Y2, PictureBox2.BackColor)
        DrawLine(BMP, X1, Y1, X2, Y1, PictureBox2.BackColor)
        DrawLine(BMP, X2, Y1, X2, Y2, PictureBox2.BackColor)
 
        PictureBox1.Image = Nothing
        PictureBox1.Image = BMP
    End Sub
 
    Private Sub PictureBox2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox2.Click
        If ColorDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
            sender.Backcolor = ColorDialog1.Color
        End If
    End Sub
 
    Private Sub Wtext_Validating(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles Wtext.Validating, Htext.Validating
        If Not IsNumeric(sender.text) Then
            e.Cancel = True : Exit Sub
        End If
        If sender.text < 1 Or sender.text > 250 Then
            e.Cancel = True : Exit Sub
        End If
    End Sub
 
 
    Private Sub Xtext_Validating(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles Xtext.Validating, Ytext.Validating
        If Not IsNumeric(sender.text) Then
            e.Cancel = True : Exit Sub
        End If
        If sender.text < 0 Or sender.text > 250 Then
            e.Cancel = True : Exit Sub
        End If
    End Sub
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.04.2013, 14:01
Ответы с готовыми решениями:

Возврат на истинный путь, или как вернуться на путь программиста
Доброго времени суток, товарищи! Зайду из далека. Окончил в 14 году универ на программиста, дипломный проект был по базам данных MS...

Прошу определить истинный адрес
Доброго дня! Прошу помощи, т.к. не разбираюсь в JS... Есть страница, в которой прикреплены JS и с помощью их она наполняется...

Прошу направить на соответствующую тему
Добрый день, на данный момент существует такая таблица &quot;Снимок&quot; из нее, собственно, необходимо сделать форму вида &quot;Снимок1&quot;,...

4
 Аватар для DENIS94
24 / 24 / 6
Регистрация: 12.04.2013
Сообщений: 122
14.04.2013, 14:11
Visual Basic
1
2
3
4
For i As Integer = X1 To X2
    y = ((Y2 - Y1) / (X2 - X1) * i) + Y1
    bm.SetPixel(i, y, C)
Next
И вам доброе.
На сколько я понял это y = ((Y2 - Y1) / (X2 - X1) * i) + Y1 - уравнение отрисовывающее гипотенузу.
В дроби снизу скобка домножается на i. Так как сначала вып. деление, то если вы хотите умножить i на скобку лучше сделать так: y = ((Y2 - Y1) / ((X2 - X1) * i)) + Y1
Хотя может проблема и не в этом. Судя по рисунку у вас идет смещение на Y1. Попробуйте убрать его из уравнения: y = ((Y2 - Y1) / (X2 - X1) * i)
0
0 / 0 / 0
Регистрация: 14.04.2013
Сообщений: 3
14.04.2013, 14:25  [ТС]
Цитата Сообщение от DENIS94 Посмотреть сообщение
В дроби снизу скобка домножается на i. Так как сначала вып. деление, то если вы хотите умножить i на скобку лучше сделать так: y = ((Y2 - Y1) / ((X2 - X1) * i)) + Y1
Хотя может проблема и не в этом. Судя по рисунку у вас идет смещение на Y1. Попробуйте убрать его из уравнения: y = ((Y2 - Y1) / (X2 - X1) * i)
Как раз таки сначала должно выполняться деление, а потом умножение (это уравнение y=kx+b), с этим все верно. Если убрать смещение на Y1 получается вот что:

т.е. при одних координатах все верно отображается, а при других нет. Если треугольник рисовать из начала координат, то тоже рисует правильно.
0
0 / 0 / 0
Регистрация: 18.04.2013
Сообщений: 3
18.04.2013, 19:58
Доброго дня.

Цитата Сообщение от redgy92 Посмотреть сообщение
y = ((Y2 - Y1) / (X2 - X1) * i) + Y1
Цитата Сообщение от redgy92 Посмотреть сообщение
(это уравнение y=kx+b), с этим все верно
Да, верно, это уравнение прямой.
И коэффициент наклона k=(Y2 - Y1) / (X2 - X1) определён верно.
Проблема в определении коэффициента смещения- b. Почему b=Y1?
Прямая, на которой лежит гипотенуза, проходит через точку с координатами (X=0, Y=b).
А она у тебя всегда проходит через точку (X=0, Y=Y1).
Смещение b рассчитывается из достроенного треугольника ,подобного рисуемому,
катет которого лежит на оси Y.
Попробуй вместо твоей строчки мою, всё должно заработать.
PureBasic
1
2
 ''y = ((Y2 - Y1) / (X2 - X1) * i) + Y1
                y = ((Y2 - Y1) / (X2 - X1) * i) + (Y1 * X2 - Y2 * X1) / (X2 - X1)
0
0 / 0 / 0
Регистрация: 14.04.2013
Сообщений: 3
08.06.2013, 21:15  [ТС]
Спасибо всем, кто помог/попытался помочь. Потерял закладку форума и забыл)) наткнулся сегодня в гугле. Для решения задачки привлек немного геометрии (тригонометрии?)
Задание: Вывести рисунок в командную кнопку, причем при ее нажатии рисунок должен меняться. Вывести прямоугольный треугольник.
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
Imports System.Drawing
Imports System.Drawing.Imaging
Public Class Form1
    Dim BMP As Bitmap
    Private Sub DrawLine(ByRef bm As Bitmap, ByVal pnt1 As PointF, ByVal pnt2 As PointF, ByVal c As Color)
        Dim i As Integer
        Const N = 500
        Dim dx As Double = (pnt2.X - pnt1.X) / N
        Dim dy As Double = (pnt2.Y - pnt1.Y) / N
        Dim X1 As Double = pnt1.X
        Dim Y1 As Double = pnt1.Y
        For i = 0 To N
            Dim X As Double = X1 + dx * i
            Dim Y As Double = Y1 + dy * i
            Try
                bm.SetPixel(X, Y, c)
            Catch ex As Exception
                'MsgBox(ex.ToString)
            End Try
        Next
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
            Dim bm As New Bitmap(OpenFileDialog1.FileName)
            Dim bm1 As New Bitmap(bm, Button1.Width, Button1.Height)
            Button1.Text = ""
            Button1.BackgroundImage = bm1
        End If
    End Sub
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        OpenFileDialog1.Filter = "*.jpg|*.jpg|*.bmp|*.bmp|*.png|*.png"
        OpenFileDialog1.FilterIndex = 1
        OpenFileDialog1.FileName = ""
        Dim bm As New Bitmap(PictureBox1.Width, PictureBox1.Height)
        BMP = bm
    End Sub
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim pnt1 As PointF
        Dim pnt2 As PointF
        Dim pnt3 As PointF
        BMP = New Bitmap(PictureBox1.Width, PictureBox1.Height)
        pnt1.X = CSng(txtX1.Text)
        pnt1.Y = CSng(txtY1.Text)
        pnt2.X = CSng(txtX2.Text)
        pnt2.Y = CSng(txtY2.Text)
        Dim Alpha As Double
        Alpha = Math.PI / 2 - Math.Atan2((pnt2.X - pnt1.X), (pnt2.Y - pnt1.Y))
        Dim R As Double = txtK1.Text
        pnt3.X = pnt2.X - R * Math.Sin(Alpha)
        pnt3.Y = pnt2.Y + R * Math.Cos(Alpha)
        DrawLine(BMP, pnt1, pnt2, PictureBox2.BackColor)
        DrawLine(BMP, pnt2, pnt3, PictureBox2.BackColor)
        DrawLine(BMP, pnt1, pnt3, PictureBox2.BackColor)
        PictureBox1.Image = Nothing
        PictureBox1.Image = BMP
    End Sub
    Private Sub PictureBox2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox2.Click
        If ColorDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
            sender.Backcolor = ColorDialog1.Color
        End If
    End Sub
    Private Sub txtY1_Validating(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtX2.Validating, txtY2.Validating, _
    txtK1.Validating, txtK2.Validating, txtX1.Validating, txtY1.Validating
        If Not IsNumeric(sender.text) Then
            e.Cancel = True : Exit Sub
        End If
        If sender.text < 0 Or sender.text > 250 Then
            e.Cancel = True : Exit Sub
        End If
    End Sub
End Class
Миниатюры
Нарисовать прямоугольний треугольник. Прошу направить на путь истинный  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.06.2013, 21:15
Помогаю со студенческими работами здесь

Направьте на путь истинный
Содержание работы: Написать программу, реализующую обмен (чтение/запись) данных по схемам &quot;Оперативная память - Внешняя память&quot;...

Направьте на путь истинный!)
Здравствуйте господа и леди форума) Начал я изучать язык программирования с++, выбрал книжку для новичка &quot; Р.Флюре.&quot; Ооп в с++,...

Наставьте на Путь Истинный
Делаю мультиплеерную мультиплатформенную пошаговую стратегию на C++/Cocos2DX. У этого движка есть уже встроенная поддержка libcurl,...

Наставьте на путь истинный
Друг уронил геймпай от xbox 360, который так же подходит для PC. Теперь при подключении компьютер его не видит. Разобрал, внутри на вид все...

Прошу меня направить в правильном напрвлении
Прошу меня направить в правильном напрвлении так как это моя первая база данных для обслуживающей компании, примерно состоит из столбцов...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru