Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Закрасить треугольньник на форме линиями Добавлено: 13.04.10 22:02  

Автор вопроса:  Programmer
Есть три точки (генерируем случайно). Нужно закрасить треугольник линиями.
Dim g As Graphics = Me.CreateGraphics
Для линии используем DrawLine. Думаю, надо рисовать линии от наиболее длинной стороны, постепенно уменьшая длину. Как упрощенный вариант задачи: есть только две точки (отрезок), надо сделать программу, которая будет рисовать в треугольник (подразумевается, что треугольник не будет на форме строго вертикально), постепенно уменьшая расстояние между этими точками. Что-то вроде этого, но не строго вверх/низ:
 ............
  ..........
   ........
    ......
     ....
      ..

Вопрос как это реализовать, чтобы он был куда-нибудь повернутым.

Заранее спасибо.

--
P.S. Я понимаю практические задачи, но вот когда надо сделать что-то эдакое... Вряд ли мне понадобится при разработке утилиты, E-Mail клиента, программы удаленного управления, Web-сервера и т.п. закрасить треугольник, поэтому я это и не умею)

Ответить

  Ответы Всего ответов: 11  

Номер ответа: 1
Автор ответа:
 Skywalker



ICQ: 300-70-6пятьЪ 

Вопросов: 62
Ответов: 545
 Web-сайт: iSkywalker.ru
 Профиль | | #1
Добавлено: 13.04.10 23:47
попробуй сдать такую шляпу:
  1. Public Class Form1
  2.     Dim red, green, blue As Integer
  3.     Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
  4.         'заменить на рандомное размещение точек
  5.         Dim p1 As New Point(10, 10)
  6.         Dim p2 As New Point(100, 30)
  7.         Dim p3 As New Point(30, 150)
  8.         Dim rnd As New Random()
  9.         Dim img As New Bitmap(Me.Bounds.Width, Me.Bounds.Height)
  10.         Dim g As Graphics = Graphics.FromImage(img)
  11.         g.Clear(Color.FromArgb(255, 255, 255))
  12.         g.DrawPolygon(Pens.Black, New Point() {p1, p2, p3})
  13.         Dim xstart, xend As Integer
  14.         Dim isFirst As Boolean = True
  15.         For y As Integer = 0 To Me.Bounds.Height - 1
  16.             For x As Integer = 0 To Me.Bounds.Width - 1
  17.                 If (img.GetPixel(x, y) <> Color.FromArgb(255, 255, 255)) Then
  18.                     If (isFirst) Then
  19.                         xstart = x
  20.                         isFirst = False
  21.                     Else
  22.                         xend = x
  23.                         DrawLine(g, xstart, xend, y)
  24.                         red = (red + rnd.Next(0, 255)) Mod 255
  25.                         green = (green + rnd.Next(0, 255)) Mod 255
  26.                         blue = (blue + rnd.Next(0, 255)) Mod 255
  27.                         isFirst = True
  28.                         Exit For
  29.                     End If
  30.                 End If
  31.             Next
  32.         Next
  33.         Me.CreateGraphics.DrawImage(img, 0, 0)
  34.     End Sub
  35.     Private Sub DrawLine(ByVal g As Graphics, ByVal xstart As Integer, ByVal xend As Integer, ByVal y As Integer)
  36.         g.DrawLine(New Pen(Color.FromArgb(red, green, blue)), xstart, y, xend, y)
  37.     End Sub
  38. End Class

Ответить

Номер ответа: 2
Автор ответа:
 Skywalker



ICQ: 300-70-6пятьЪ 

Вопросов: 62
Ответов: 545
 Web-сайт: iSkywalker.ru
 Профиль | | #2
Добавлено: 13.04.10 23:53
еще перед
  1. For x As Integer = 0 To Me.Bounds.Width - 1

вставить
  1. isFirst = True

Ответить

Номер ответа: 3
Автор ответа:
 Winand



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #3
Добавлено: 13.04.10 23:57
Нарисовать кучу линий, которые будут начинаться в одном из углов, а заканчиваться на противоположной к этому углу стороне, постепенно продвигаясь от второго угла к третьему. Бред, но заковыристо изложенная мысль понравилась)

Ответить

Номер ответа: 4
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #4
Добавлено: 14.04.10 01:02
Programmer пишет:
поэтому я это и не умею

Если ты не знаешь математику, ты не станешь программистом, запомни.

Ответить

Номер ответа: 5
Автор ответа:
 AWP



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #5
Добавлено: 14.04.10 01:41
почему именно линиями?

Вообще вот тебе код.
делит треугольник на 2 и красит их сверху-вниз.

  1. Private Type PointApi
  2.   X As Long
  3.   Y As Long
  4. End Type
  5.  
  6. Private Sub DrawT(Pc As PictureBox, a1 As PointApi, a2 As PointApi, a3 As PointApi)
  7.   Dim P1 As PointApi, P2 As PointApi, P3 As PointApi
  8.   Dim N As Long
  9.   Dim PT(2) As PointApi
  10.   
  11.   If a1.Y = a2.Y Then
  12.     If a3.Y > a1.Y Then
  13.       If a1.X < a2.X Then
  14.         DrawVPT Pc, a1.Y, a3.Y, a1.X, a3.X, a2.X - a1.X, 1
  15.         Exit Sub
  16.       Else
  17.         DrawVPT Pc, a1.Y, a3.Y, a2.X, a3.X, a1.X - a2.X, 1
  18.         Exit Sub
  19.       End If
  20.     Else
  21.       If a1.X < a2.X Then
  22.         DrawVPT Pc, a3.Y, a1.Y, a3.X, a1.X, a2.X - a1.X, 0
  23.         Exit Sub
  24.       Else
  25.         DrawVPT Pc, a3.Y, a1.Y, a3.X, a2.X, a1.X - a2.X, 0
  26.         Exit Sub
  27.       End If
  28.     End If
  29.   End If
  30.   
  31.   If a1.Y = a3.Y Then
  32.     If a3.Y > a2.Y Then
  33.       If a1.X < a3.X Then
  34.         DrawVPT Pc, a2.Y, a1.Y, a2.X, a1.X, a3.X - a1.X, 0
  35.         Exit Sub
  36.       Else
  37.         DrawVPT Pc, a2.Y, a3.Y, a2.X, a3.X, a1.X - a3.X, 0
  38.         Exit Sub
  39.       End If
  40.     Else
  41.       If a1.X < a3.X Then
  42.         DrawVPT Pc, a1.Y, a2.Y, a1.X, a2.X, a3.X - a1.X, 1
  43.         Exit Sub
  44.       Else
  45.         DrawVPT Pc, a2.Y, a3.Y, a2.X, a3.X, a1.X - a3.X, 1
  46.         Exit Sub
  47.       End If
  48.     End If
  49.   End If
  50.   
  51.   If a3.Y = a2.Y Then
  52.     If a1.Y > a3.Y Then
  53.       'V
  54.       If a3.X < a2.X Then
  55.         DrawVPT Pc, a3.Y, a1.Y, a3.X, a1.X, a2.X - a3.X, 1
  56.         Exit Sub
  57.       Else
  58.         DrawVPT Pc, a3.Y, a1.Y, a2.X, a1.X, a3.X - a2.X, 1
  59.         Exit Sub
  60.       End If
  61.     Else
  62.       '^
  63.       If a3.X < a2.X Then
  64.         DrawVPT Pc, a1.Y, a3.Y, a1.X, a3.X, a2.X - a3.X, 0
  65.         Exit Sub
  66.       Else
  67.         DrawVPT Pc, a1.Y, a3.Y, a1.X, a2.X, a3.X - a2.X, 0
  68.         Exit Sub
  69.       End If
  70.     End If
  71.   End If
  72.   
  73.   PT(0) = a1: PT(1) = a2: PT(2) = a3
  74.   Min = 99999#
  75.   Max = -99999#
  76.   mini = 0: maxi = 0
  77.   For N = 0 To 2
  78.     If PT(N).Y < Min Then Min = PT(N).Y: mini = N
  79.     If PT(N).Y > Max Then Max = PT(N).Y: maxi = N
  80.   Next
  81.   avgi = 3 - mini - maxi
  82.   
  83.   x2 = PT(maxi).X - PT(mini).X
  84.   y2 = PT(maxi).Y - PT(mini).Y
  85.   sY = PT(avgi).Y
  86.   sX = x2 / (y2 / (sY - PT(mini).Y)) + PT(mini).X
  87.   
  88.   If PT(avgi).X > sX Then
  89.     DrawVPT Pc, Int(PT(mini).Y), Int(PT(avgi).Y), Int(PT(mini).X), Int(sX), PT(avgi).X - sX, 0
  90.     DrawVPT Pc, Int(PT(avgi).Y), Int(PT(maxi).Y), Int(sX), Int(PT(maxi).X), PT(avgi).X - sX, 1
  91.   Else
  92.     DrawVPT Pc, Int(PT(mini).Y), Int(PT(avgi).Y), Int(PT(mini).X), Int(PT(avgi).X), Int(sX - PT(avgi).X), 0
  93.     DrawVPT Pc, Int(PT(avgi).Y), Int(PT(maxi).Y), Int(PT(avgi).X), Int(PT(maxi).X), Int(sX - PT(avgi).X), 1
  94.   End If
  95. 2
  96.  
  97. End Sub
  98.  
  99. Private Sub DrawVPT(Pc As PictureBox, Y1, y2, X1, x2, W, K)
  100. On Error GoTo 2
  101.   Dim H As Long
  102.   Dim X As Long, Y As Long
  103.   Dim sX As Single, ssX As Single
  104.   Dim PR As Double
  105.   Dim cx1 As Single, yy1 As Single, cw As Single, cx As Single
  106.  
  107.   X1 = (X1)
  108.   Y1 = (Y1)
  109.   x2 = (x2)
  110.   y2 = (y2)
  111.   
  112.   H = y2 - Y1
  113.   sX = W / H
  114.   ssX = (x2 - X1) / H
  115.   For Y = 1 To H
  116.     If K = 0 Then
  117.       cw = CInt(Y * sX)
  118.     Else
  119.       cw = CInt((H - Y) * sX)
  120.     End If
  121.     cx = (Y * ssX)
  122.     cx1 = (X1 + cx)
  123.     yy1 = CLng(Y1 + Y)
  124.     Pc.Line (cx1, yy1)-(cx1 + cw, yy1), 0
  125. 2
  126.   Next
  127. End Sub
  128.  
  129. Private Sub Command1_Click()
  130.   Dim a1 As PointApi, a2 As PointApi, a3 As PointApi
  131.   a1.X = 0: a1.Y = 0
  132.   a2.X = 100: a2.Y = 25
  133.   a3.X = 50: a3.Y = 75
  134.   DrawT Pc, a1, a2, a3
  135. End Sub

Ответить

Номер ответа: 6
Автор ответа:
 AWP



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #6
Добавлено: 14.04.10 01:44
убери из кода все Int, CInt, Clng. Они для других целей предназначались.

Ответить

Номер ответа: 7
Автор ответа:
 Millenium



ICQ: 629966 

Вопросов: 118
Ответов: 903
 Web-сайт: www.aliyev.us
 Профиль | | #7
Добавлено: 14.04.10 08:57
А не легчели использовать BitBlt. Там много вещей для работы с графикой. И темболие есть FillColor :) что облегчает твою задачу.

Ответить

Номер ответа: 8
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #8 Добавлено: 14.04.10 09:50
Вот вы тут фигней занимаетесь... Это все делается гораздо проще:
1. Создается кисть(Brush) с 1 линией..
2. Создается регион из треугольника
3. Этот регион закрашиваем этой кистью...

Done...

З.ы. По мимо всего прочего есть такая штука как System.Drawing.Drawing2D.HatchBrush, которая уже имеет в своем составе туеву хучу заранее предопределенных стилей линий,точек и прочей лабуды.. Для конкретной этой задачи возможно и не подойдет, но для общегоразвития должны знать..

Ответить

Номер ответа: 9
Автор ответа:
 AWP



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #9
Добавлено: 14.04.10 10:44
Нут а кто говорить, что это vb.net?
можно еще GradientFill предложить, но ему линиями нужно.

Ответить

Номер ответа: 10
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #10 Добавлено: 14.04.10 10:54
Нут а кто говорить, что это vb.net?

Это аффтар топика говорит.. или
  1. Dim g As Graphics = Me.CreateGraphics

в VB6 тоже будет работать? )))

Ответить

Номер ответа: 11
Автор ответа:
 AWP



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #11
Добавлено: 14.04.10 12:33
не заметилс... :)

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам