Новичок
Профиль
Группа: Участник
Сообщений: 11
Регистрация: 5.1.2007
Репутация: нет Всего: нет
|
То ли лыжи... ну вы поняли ) Такая проблема. Есть 2 шестерни, расположенные рядом, так, что зубцы входят в пазы друг друга (как и нужно шестерням). Вращаются в противоположные стороны. Все вроде нормально, но...! 1) Для клонирования шестерни использовал метод GraphicsPath.Widen(pen, matrix), и при этом перестал работать метод e.Graphics.FillPath(). Не заливает, а просто делает обрамление контура, и все. 2) Вторую шестерню заметно "ведет", т.е. ее немного шатает из стороны в сторону. Из-за этого шестерни переодически пересекаются друг с другом. Кто знает, как побороть эти проблемы? код form1.vb | Код | 'Option Strict On Imports System.Drawing.Drawing2D Public Class Form1 Dim i As Integer Dim j As Integer = 90 Dim k As Integer = 4 Dim m As Integer = 184
Private Sub Forml_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint Dim t As New triangle e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias 'e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighSpeed
t.build(e) i += 1.6 If i >= 360 Or j >= 360 Then i = 0 j = 90 End If t.Triangle(e, i, j)
k -= Math.Abs(i) * 3
t.Scale(e, k, m) k = 4
End Sub
Private Sub Timerl_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles Timer1.Tick Invalidate() End Sub
Private Sub Axis() Dim g As Graphics Dim i As Integer Dim nX As Integer Dim nY As Integer Dim ArialFont As Font ArialFont = New System.Drawing.Font("Arial", 5, FontStyle.Bold)
g = Me.CreateGraphics nX = Me.Width 'длина nY = Me.Height 'ширина
For i = 0 To Me.Height Step 10 g.DrawLine(Pens.Black, 0, i, Me.Width, i) g.DrawString(i / 10, ArialFont, Brushes.Black, 0, i) Next
For i = 0 To Me.Width Step 10 g.DrawLine(Pens.Black, i, 0, i, Me.Height) g.DrawString(Integer.Parse(CStr(i)) / 10, ArialFont, Brushes.Black, i, 0) Next
End Sub
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load MyClass.SetStyle(ControlStyles.UserPaint, True) MyClass.SetStyle(ControlStyles.AllPaintingInWmPaint, True) MyClass.SetStyle(ControlStyles.DoubleBuffer, True) End Sub
Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown Timer1.Enabled = False Axis() End Sub
End Class
|
код модуля triangle.vb | Код | Imports System.Drawing.Drawing2D Public Class triangle Dim ps1() As PointF = {New PointF(0, 110), New PointF(110, 60), New PointF(220, 110), New PointF(110, 160)} Dim ps2() As PointF = {New PointF(4.748158, 82.52991), New PointF(123.9409, 62.70371), New PointF(217.2518, 139.4701), New PointF(98.5904, 159.2963)} '15 Dim ps3() As PointF = {New PointF(15.7372, 56), New PointF(136, 67.69872), New PointF(206.2628, 166), New PointF(86, 154.3013)} '30 Dim ps4() As PointF = {New PointF(33.21825, 33.21825), New PointF(146.3553, 75.64465), New PointF(188.7817, 188.7817), New PointF(75.64465, 146.3553)} '30 Dim ps5() As PointF = {New PointF(55.99998, 15.73721), New PointF(154.3013, 85.99999), New PointF(166, 206.2628), New PointF(67.69872, 136)} '60 Dim ps6() As PointF = {New PointF(82.52989, 4.748159), New PointF(159.2963, 98.05904), New PointF(139.4701, 217.2518), New PointF(62.7037, 123.9409)} '75 Dim rotationPoint As New PointF(110.0F, 110.0F) Dim rotationTransform As New Matrix(1, 0, 0, 1, 1, 1) Dim pm As New Matrix(1, 0, 0, 1, 200, 1) Dim gp As New GraphicsPath Dim gp1 As New GraphicsPath Dim gp2 As New GraphicsPath Dim gp3 As New GraphicsPath
Public Sub New() End Sub
Public Sub build(ByVal e) gp.AddPolygon(ps1) gp.AddPolygon(ps2) gp.AddPolygon(ps3) gp.AddPolygon(ps4) gp.AddPolygon(ps5) gp.AddPolygon(ps6) 'gp.AddEllipse(80, 80, 60, 60) 'мелкий эллипс в центре 'gp.AddRectangle(New Rectangle(95, 95, 3, 3)) 'индикатор движения для мелкого gp1 = CType(gp.Clone(), GraphicsPath) 'клон полигонов (что бы немного сократить объем работ) gp2.AddEllipse(23, 23, 175, 175) 'большой эллипс gp2.AddEllipse(80, 80, 60, 60) 'мелкий эллипс (для границ заливки) gp3.AddRectangle(New Rectangle(55, 55, 3, 3)) 'индикатор движения для большого gp3.AddEllipse(80, 80, 60, 60)
End Sub
Public Sub Triangle(ByVal e As PaintEventArgs, ByVal i As Integer, ByVal j As Integer)
rotationTransform.RotateAt(i, CType(rotationPoint, PointF)) 'первая партия полигонов gp.Transform(rotationTransform) 'трансформация e.Graphics.DrawPath(New Pen(Color.Black, 4), gp) 'рисование e.Graphics.FillPath(Brushes.AliceBlue, gp) 'закрашивание
rotationTransform.RotateAt(j, CType(rotationPoint, PointF)) 'вторая партия (с 90) gp1.Transform(rotationTransform) e.Graphics.DrawPath(New Pen(Color.Black, 4), gp1) e.Graphics.FillPath(Brushes.AliceBlue, gp1)
gp2.Transform(rotationTransform) 'партия эллипсов 'e.Graphics.DrawPath(New Pen(Color.Black, 0), gp2) e.Graphics.FillPath(Brushes.AliceBlue, gp2)
gp3.Transform(rotationTransform) 'партия эллипсов e.Graphics.DrawPath(New Pen(Color.Black, 2), gp3) 'e.Graphics.FillPath(Brushes.Khaki, gp2)
'e.Graphics.ScaleTransform() '?
End Sub
Public Sub Scale(ByVal e As PaintEventArgs, ByVal k As Integer, ByVal m As Integer) rotationTransform.RotateAt(k, CType(rotationPoint, PointF)) 'первая партия полигонов gp.Transform(rotationTransform) 'трансформация gp.Widen(Pens.Black, pm) e.Graphics.DrawPath(New Pen(Color.Black, 4), gp) 'рисование e.Graphics.FillPath(Brushes.AliceBlue, gp) 'закрашивание
rotationTransform.RotateAt(m, CType(rotationPoint, PointF)) 'первая партия полигонов gp1.Transform(rotationTransform) 'трансформация gp1.Widen(Pens.Black, pm) e.Graphics.DrawPath(New Pen(Color.Black, 4), gp1) e.Graphics.FillPath(Brushes.AliceBlue, gp1)
gp2.Transform(rotationTransform) 'партия эллипсов gp2.Widen(Pens.Black, pm) e.Graphics.DrawPath(New Pen(Color.Black, 0), gp2) e.Graphics.FillPath(Brushes.DarkKhaki, gp2)
gp3.Transform(rotationTransform) 'партия эллипсов gp3.Widen(Pens.Black, pm) e.Graphics.DrawPath(New Pen(Color.Black, 2), gp3) End Sub End Class
|
Присоединённый файл ( Кол-во скачиваний: 9 )
scr.JPG 50,50 Kb
|