-
VB.NET魔法阵生成(1)画一个N角的星星
转载请注明来自 http://a11s.cnblogs.com 作者:董含君
计划是做魔法阵生成器的,后来仔细研究,需要大量的解析几何 数据结构 拼凑算法 随机算法 等等相关内容,所以不可能一次性解决问题了.所以发来当前进度描述一下过程以及想法.不一定能坚持写下去,到了后面的规则制定我头都大了.
--------------------------------------------------------------------------
用途:计算2D飞行游戏弹道,比如彩京那样的,放置游戏人物,屏幕保护,媒体播放器的视觉效果.
一个6边形,根据r扩散.取r两次.则有两个顶点列表.根据这两个停电列表可以表示弹道轨迹.然后旋转魔法阵,得到新的顶点列表,重复上述操作,可以得到任意发散的子弹图形
如果对两个子弹的弹道加上初始速度以及加速度,则可以表示变速直线运动,创造更华丽的子弹组合效果.
如果有了随机生成魔法阵算法,理论上游戏人物的初始位置排列都可以生成
虽然可以随机出现,但是如果用魔法阵顶点来做,会更有规律,生成的敌人组合排列更强,更加合理.因为魔法阵的生成都是有规律的,攻击型的图形表示可以放攻击型人物等等
因为牵扯随机算法,就是给出要求("比如咒语"),然后根据条件生成魔法阵的过程,就是要求根据"指定规则"后的映射
比如你给出一系列条件:攻击型5个,防御性一个,防御为主,同时复杂程度不超过N(魔法阵外层常量)....其他条件等等.然后根据算法,提取出数字,用作权值.生成魔法阵
N的取得是根据权值而定,就是N越大,魔法阵面积越大,外围图形越多(有隐形的辅助线) 而且如果敌人有人死亡,比如攻击的减少了一个,而且还是防御为主..那么再次带入还能生成新的魔法阵 重新排列防守阵型
强烈怀疑,一开始提出魔法阵的人,绝对不是因为好看!!只不过没有人认真研究罢了.这个很像八卦阵的,全都是数学以及数据关系
---------------------------------------------------------------------------
不废话了...
魔法阵生成系统的第一步 画一个正N角星
这个是基础的基础,正N角星包含正N边形,当N大于一定程度的时候可以近似表示圆,我们需要的顶点列表都可以被线性表描述出来,从而根据下标筛选所需的点.
对于正N角星,基础就是所在外接圆,然后通过极坐标->平面坐标转化求出顶点
这个就很简单了,高中内容
-------------------极坐标 到 平面坐标的转化--------------
Function Trans(ByVal jizuobiao As CAPI, Optional ByVal StartX As Integer = CStartX, Optional ByVal StartY As Integer = CStartY) As System.Drawing.Point
Dim P As System.Drawing.Point
'P(x,y)就是极坐标的 (Sin a)x 半径r 以及cos a x半径r
P.X = StartX + CLng(Math.Sin(jizuobiao.a) * jizuobiao.r)
P.Y = StartY + CLng(Math.Cos(jizuobiao.a) * jizuobiao.r)
Trans = P
End Function
----------------------------------------------------------------------
另外微软提供的arraylist似乎没有环形链表,尝试用他的queuq的时候,也不好改动,于是我索性干脆自己写了一个.其中包含以下要素:
-------------------------------
Public Class Node
'下一个节点
Public NextNode As Node
Public Container As RoundQueue
'上一个节点
Public PrevNode As Node
'元素信息,用Object表示
Public objData As Object
Public visitFlas As Integer
'插入节点
Public Function InsertNextByData(ByRef d As Object) As Node
Public Sub deleteNode()
Protected Overrides Sub Finalize()
End Class
Public Class RoundQueue
'Public EnableBack As Boolean
'虚拟的头节点
Public Root As Node
Public TotalNodes As Long '总数
Public CurrentNode As Node '当前指针
Public Sub New()
Public Sub New(ByRef L As ArrayList)
Public Function InsertNode(ByRef tarNode As Node, ByRef newNode As Node) As Node
Public Function InsertNode(ByRef tarNode As Node, ByRef newNode As Node, ByRef DataOfNewNode As Object)
Public Function MovePrev() As Node
Public Property GetData() As Object
Protected Overrides Sub Finalize()
Public Sub Dispose()
End Class
--------------------------------------------------
有了以上材料作为基础,开始研究算法.
网上找到的大部分都是LOGO语言的,没办法,人家天生适合画这个.
给出函数
DrawAngle(ByVal Num As Long, ByVal Steps As Long, ByRef map As Bitmap, ByVal x As Long, ByVal y As Long, ByVal r As Long, ByVal basea As Single, ByVal penA As Drawing.Pen)
提供角的数量,跨越点数,目标图像,圆心半径起始角度(用于旋转),以及画笔(颜色,粗细)绘制图形
1 所有的大于2的奇数的正N角星都能一笔画出
(也就是我们可以一直用.nextnode来画)
2 除了六角星以外 所有大于3的正N角星都能一笔画出
(一笔画出就是没有跳跃间断点)
3 大于5的正N角星,会有 ((边数-1)/2)上取整种有效画法
不仅仅是一种画法,当边数等于0或者自身的时候无意义,重复的图形无意义
4 间断点位置,(当角的数量/间隔点差(包含自身))=K的余数为0的点就是断点.
5 当断点出现的时候,当前图形就是基本图形,整个图形在此基础上错位 K次就是整个图形
6 基本图形错位K次的结果不会有任何重复线段以及顶点,而且可以遍历整个节点
以下以正8角星为例(3,4,5,6都有特例,所以不好办) 如图
------------------------------------
算法:
1 创建m的元素的数组
2 根据m的个数,取得间隔的角度a
3 根据极坐标转化,得到第一个顶点的位置
4 依次类推取得全部顶点
5 将顶点加入环形链表(严格的说,不算队列)
6 绘制,检测错位
--------------
For i = 1 To RQ.TotalNodes
If RQ.CurrentNode.visitFlas = 1 And GetNextNNode(RQ.CurrentNode, Steps).visitFlas = 1 Then
'如果下一个节点的下一个节点已经访问那么
RQ.MoveNext()
If i < RQ.TotalNodes - 1 Then i = i - 1
Else
g.DrawLine(penA, RQ.CurrentNode.objData, MoveNextNNode(RQ.CurrentNode, Steps).objData)
RQ.CurrentNode.visitFlas = 1
End If
Next
-------------
最终效果:
源代码:
Module Module1
Function DrawAngle(ByVal Num As Long, ByVal Steps As Long, ByRef map As Bitmap, ByVal x As Long, ByVal y As Long, ByVal r As Long, ByVal basea As Single, ByVal penA As Drawing.Pen)
If map Is Nothing Then
Exit Function
End If
Dim g As System.Drawing.Graphics
g = g.FromImage(map)
Dim RQ As RoundQueue = CreatePointQueueA(x, y, r, Num, basea)
Dim i As Long
''''''''' Draw
For i = 1 To RQ.TotalNodes
If RQ.CurrentNode.visitFlas = 1 And GetNextNNode(RQ.CurrentNode, Steps).visitFlas = 1 Then
'如果下一个节点的下一个节点已经访问那么
RQ.MoveNext()
If i < RQ.TotalNodes - 1 Then i = i - 1
Else
g.DrawLine(penA, RQ.CurrentNode.objData, MoveNextNNode(RQ.CurrentNode, Steps).objData)
RQ.CurrentNode.visitFlas = 1
End If
Next
End Function
Sub DrawLine(ByVal fromPoint As Drawing.Point, ByVal toPoint As Drawing.Point)
End Sub
Function GetNextNNode(ByVal tarnode As Node, ByVal n As Long) As Node
Dim i
For i = 1 To n
tarnode = tarnode.NextNode
Next
Return tarnode
End Function
Function MoveNextNNode(ByRef tarnode As Node, ByVal n As Long) As Node
Dim i
For i = 1 To n
tarnode = tarnode.NextNode
Next
Return tarnode
End Function
End Module
Public Class RoundQueue
'Public EnableBack As Boolean
'虚拟的头节点
Public Root As Node
Public TotalNodes As Long '总数
Public CurrentNode As Node '当前指针
''''''''
Public Sub New()
'新的根节点
Root = New Node
'全部指向自己
Root.PrevNode = Root
Root.NextNode = Root
'当前节点指向跟节点
CurrentNode = Root
Root.Container = Me
TotalNodes = 1
End Sub
Public Sub New(ByRef L As ArrayList)
Me.New()
If L.Count < 0 Then Exit Sub
Root.objData = L.Item(0)
Dim i As Long
For i = 1 To L.Count - 1
Dim cn As Node
If i = 1 Then
cn = InsertNode(Root, New Node, L.Item(i))
Else
cn = InsertNode(CurrentNode, New Node, L.Item(i))
End If
cn.objData = cn.objData
CurrentNode.NextNode = cn
Next
Root = CurrentNode
Root = Root.NextNode
'最后一个节点指向头节点
'CurrentNode.PrevNode = Root
'头节点的上一个节点指向最后一个
'Root.PrevNode = CurrentNode
'指针移动到开始
'CurrentNode = Root
End Sub
Public Function InsertNode(ByRef tarNode As Node, ByRef newNode As Node) As Node
'保存旧的数据
Dim oldnode As Node
oldnode = tarNode.NextNode
'连接新的数据
tarNode.NextNode = newNode
newNode.PrevNode = tarNode
newNode.NextNode = oldnode
'连接旧的数据
oldnode.PrevNode = newNode
'返回刚刚插入的Node
TotalNodes += 1
newNode.Container = Me
Return newNode
End Function
Public Function InsertNode(ByRef tarNode As Node, ByRef newNode As Node, ByRef DataOfNewNode As Object)
'保存旧的数据
Dim oldnode As Node
oldnode = tarNode.NextNode
'连接新的数据
tarNode.NextNode = newNode
newNode.PrevNode = tarNode
newNode.NextNode = oldnode
'连接旧的数据
oldnode.PrevNode = newNode
newNode.objData = DataOfNewNode
newNode.Container = Me
TotalNodes += 1
Return newNode
End Function
Public Function MoveNext() As Node
CurrentNode = CurrentNode.NextNode
End Function
Public Function MovePrev() As Node
CurrentNode = CurrentNode.PrevNode
End Function
Public Property GetData() As Object
Get
Return CurrentNode.objData
End Get
Set(ByVal Value As Object)
CurrentNode.objData = Value
End Set
End Property
Protected Overrides Sub Finalize()
MyBase.Finalize()
End Sub
Public Sub Dispose()
Finalize()
End Sub
End Class
Public Class Node
'下一个节点
Public NextNode As Node
Public Container As RoundQueue
'上一个节点
Public PrevNode As Node
'元素信息,用Object表示
Public objData As Object
Public visitFlas As Integer
'插入节点
Public Function InsertNextByData(ByRef d As Object) As Node
Dim n As New Node 'new
n.objData = d 'add data
n.PrevNode = Me '确定前驱
Me.NextNode = n '自己确定后继
Container.TotalNodes += 1
Return n '返回
End Function
Public Sub deleteNode()
'Dim t As Node
't = Me.NextNode
If Container.TotalNodes <= 1 Then
Me.Finalize()
Container.Dispose()
End If
Me.PrevNode.NextNode = Me.NextNode
Me.NextNode.PrevNode = Me.PrevNode
Me.Finalize()
End Sub
Protected Overrides Sub Finalize()
MyBase.Finalize()
End Sub
End Class
Public Class Form1
Inherits System.Windows.Forms.Form
#Region " Windows 窗体设计器生成的代码 "
Public Sub New()
MyBase.New()
'该调用是 Windows 窗体设计器所必需的。
InitializeComponent()
'在 InitializeComponent() 调用之后添加任何初始化
End Sub
'窗体重写 dispose 以清理组件列表。
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
'Windows 窗体设计器所必需的
Private components As System.ComponentModel.IContainer
'注意: 以下过程是 Windows 窗体设计器所必需的
'可以使用 Windows 窗体设计器修改此过程。
'不要使用代码编辑器修改它。
Friend WithEvents Button1 As System.Windows.Forms.Button
Friend WithEvents ListBox1 As System.Windows.Forms.ListBox
Friend WithEvents Button2 As System.Windows.Forms.Button
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.Button1 = New System.Windows.Forms.Button
Me.ListBox1 = New System.Windows.Forms.ListBox
Me.Button2 = New System.Windows.Forms.Button
Me.SuspendLayout()
'
'Button1
'
Me.Button1.Location = New System.Drawing.Point(360, 96)
Me.Button1.Name = "Button1"
Me.Button1.Size = New System.Drawing.Size(120, 48)
Me.Button1.TabIndex = 0
Me.Button1.Text = "next"
'
'ListBox1
'
Me.ListBox1.ItemHeight = 12
Me.ListBox1.Location = New System.Drawing.Point(16, 8)
Me.ListBox1.Name = "ListBox1"
Me.ListBox1.Size = New System.Drawing.Size(200, 316)
Me.ListBox1.TabIndex = 1
'
'Button2
'
Me.Button2.Location = New System.Drawing.Point(360, 168)
Me.Button2.Name = "Button2"
Me.Button2.Size = New System.Drawing.Size(120, 48)
Me.Button2.TabIndex = 2
Me.Button2.Text = "prve"
'
'Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(6, 14)
Me.ClientSize = New System.Drawing.Size(496, 373)
Me.Controls.Add(Me.Button2)
Me.Controls.Add(Me.ListBox1)
Me.Controls.Add(Me.Button1)
Me.Name = "Form1"
Me.Text = "Form1"
Me.ResumeLayout(False)
End Sub
#End Region
Dim lianbiao As RoundQueue
Dim arr As New ArrayList
Dim i As Long
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
ListBox1.Items.Clear()
For i = 1 To 30
ListBox1.Items.Add(lianbiao.CurrentNode.objData)
lianbiao.CurrentNode = lianbiao.CurrentNode.NextNode
Next
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
For i = 1 To 7
arr.Add("第" + i.ToString + "个")
Next
lianbiao = New RoundQueue(arr)
lianbiao.CurrentNode = lianbiao.Root
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
ListBox1.Items.Clear()
For i = 1 To 30
ListBox1.Items.Add(lianbiao.CurrentNode.objData)
lianbiao.CurrentNode = lianbiao.CurrentNode.PrevNode
Next
End Sub
End Class
Module Module2
Public Const PI = 3.141592654
Public Const CStartX = 200
Public Const CStartY = 200
Public Structure CAPI
Public a As Single
Public r As Single
End Structure
Function Trans(ByVal jizuobiao As CAPI, Optional ByVal StartX As Integer = CStartX, Optional ByVal StartY As Integer = CStartY) As System.Drawing.Point
Dim P As System.Drawing.Point
P.X = StartX + CLng(Math.Sin(jizuobiao.a) * jizuobiao.r)
P.Y = StartY + CLng(Math.Cos(jizuobiao.a) * jizuobiao.r)
Trans = P
End Function
Public Function CreatePointQueueA(ByVal x As Long, ByVal y As Long, ByVal r As Long, ByVal itemscount As Long, Optional ByVal Basea As Single = 0) As RoundQueue
Dim q As New RoundQueue
Dim a As Single
Dim j As CAPI
a = 2 * Math.PI / itemscount
Dim PointList(itemscount - 1) As Drawing.Point
'''Now Create list
Dim i As Long
For i = 0 To itemscount - 1
j.a = Basea + a * (i + 1)
j.r = r
PointList(i) = Trans(j, x, y)
Next
'''enqueue
Dim RQ As New RoundQueue(New ArrayList(PointList))
Return RQ
End Function
End Module
Public Class Form2
Inherits System.Windows.Forms.Form
Dim penA As Pen
#Region " Windows 窗体设计器生成的代码 "
Public Sub New()
MyBase.New()
'该调用是 Windows 窗体设计器所必需的。
InitializeComponent()
'在 InitializeComponent() 调用之后添加任何初始化
End Sub
'窗体重写 dispose 以清理组件列表。
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
'Windows 窗体设计器所必需的
Private components As System.ComponentModel.IContainer
'注意: 以下过程是 Windows 窗体设计器所必需的
'可以使用 Windows 窗体设计器修改此过程。
'不要使用代码编辑器修改它。
Friend WithEvents Button1 As System.Windows.Forms.Button
Friend WithEvents PictureBox1 As System.Windows.Forms.PictureBox
Friend WithEvents TextBox1 As System.Windows.Forms.TextBox
Friend WithEvents Label1 As System.Windows.Forms.Label
Friend WithEvents Label2 As System.Windows.Forms.Label
Friend WithEvents TextBox2 As System.Windows.Forms.TextBox
Friend WithEvents Label3 As System.Windows.Forms.Label
Friend WithEvents TextBox3 As System.Windows.Forms.TextBox
Friend WithEvents Label4 As System.Windows.Forms.Label
Friend WithEvents TextBox4 As System.Windows.Forms.TextBox
Friend WithEvents Label5 As System.Windows.Forms.Label
Friend WithEvents TextBox5 As System.Windows.Forms.TextBox
Friend WithEvents Label6 As System.Windows.Forms.Label
Friend WithEvents VScrollBar1 As System.Windows.Forms.VScrollBar
Friend WithEvents Label7 As System.Windows.Forms.Label
Friend WithEvents Label8 As System.Windows.Forms.Label
Friend WithEvents TextBox7 As System.Windows.Forms.TextBox
Friend WithEvents Button2 As System.Windows.Forms.Button
Friend WithEvents ColorDialog1 As System.Windows.Forms.ColorDialog
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.Button1 = New System.Windows.Forms.Button
Me.PictureBox1 = New System.Windows.Forms.PictureBox
Me.TextBox1 = New System.Windows.Forms.TextBox
Me.Label1 = New System.Windows.Forms.Label
Me.Label2 = New System.Windows.Forms.Label
Me.TextBox2 = New System.Windows.Forms.TextBox
Me.Label3 = New System.Windows.Forms.Label
Me.TextBox3 = New System.Windows.Forms.TextBox
Me.Label4 = New System.Windows.Forms.Label
Me.TextBox4 = New System.Windows.Forms.TextBox
Me.Label5 = New System.Windows.Forms.Label
Me.TextBox5 = New System.Windows.Forms.TextBox
Me.Label6 = New System.Windows.Forms.Label
Me.VScrollBar1 = New System.Windows.Forms.VScrollBar
Me.Label7 = New System.Windows.Forms.Label
Me.Label8 = New System.Windows.Forms.Label
Me.TextBox7 = New System.Windows.Forms.TextBox
Me.Button2 = New System.Windows.Forms.Button
Me.ColorDialog1 = New System.Windows.Forms.ColorDialog
Me.SuspendLayout()
'
'Button1
'
Me.Button1.Location = New System.Drawing.Point(424, 8)
Me.Button1.Name = "Button1"
Me.Button1.Size = New System.Drawing.Size(104, 32)
Me.Button1.TabIndex = 0
Me.Button1.Text = "Draw It!!"
'
'PictureBox1
'
Me.PictureBox1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
Me.PictureBox1.Location = New System.Drawing.Point(8, 64)
Me.PictureBox1.Name = "PictureBox1"
Me.PictureBox1.Size = New System.Drawing.Size(440, 328)
Me.PictureBox1.TabIndex = 1
Me.PictureBox1.TabStop = False
'
'TextBox1
'
Me.TextBox1.Location = New System.Drawing.Point(72, 8)
Me.TextBox1.Name = "TextBox1"
Me.TextBox1.Size = New System.Drawing.Size(40, 21)
Me.TextBox1.TabIndex = 2
Me.TextBox1.Text = "7"
'
'Label1
'
Me.Label1.Location = New System.Drawing.Point(16, 16)
Me.Label1.Name = "Label1"
Me.Label1.Size = New System.Drawing.Size(56, 16)
Me.Label1.TabIndex = 3
Me.Label1.Text = "角的数量"
'
'Label2
'
Me.Label2.Location = New System.Drawing.Point(120, 16)
Me.Label2.Name = "Label2"
Me.Label2.Size = New System.Drawing.Size(32, 16)
Me.Label2.TabIndex = 4
Me.Label2.Text = "间隔"
'
'TextBox2
'
Me.TextBox2.Location = New System.Drawing.Point(152, 8)
Me.TextBox2.Name = "TextBox2"
Me.TextBox2.Size = New System.Drawing.Size(40, 21)
Me.TextBox2.TabIndex = 5
Me.TextBox2.Text = "1"
'
'Label3
'
Me.Label3.Location = New System.Drawing.Point(200, 16)
Me.Label3.Name = "Label3"
Me.Label3.Size = New System.Drawing.Size(32, 16)
Me.Label3.TabIndex = 6
Me.Label3.Text = "半径"
'
'TextBox3
'
Me.TextBox3.Location = New System.Drawing.Point(232, 8)
Me.TextBox3.Name = "TextBox3"
Me.TextBox3.Size = New System.Drawing.Size(40, 21)
Me.TextBox3.TabIndex = 30
Me.TextBox3.Text = "50"
'
'Label4
'
Me.Label4.Location = New System.Drawing.Point(280, 16)
Me.Label4.Name = "Label4"
Me.Label4.Size = New System.Drawing.Size(8, 16)
Me.Label4.TabIndex = 31
Me.Label4.Text = "X"
'
'TextBox4
'
Me.TextBox4.Location = New System.Drawing.Point(296, 8)
Me.TextBox4.Name = "TextBox4"
Me.TextBox4.Size = New System.Drawing.Size(40, 21)
Me.TextBox4.TabIndex = 32
Me.TextBox4.Text = "200"
'
'Label5
'
Me.Label5.Location = New System.Drawing.Point(336, 16)
Me.Label5.Name = "Label5"
Me.Label5.Size = New System.Drawing.Size(8, 16)
Me.Label5.TabIndex = 33
Me.Label5.Text = "Y"
'
'TextBox5
'
Me.TextBox5.Location = New System.Drawing.Point(352, 8)
Me.TextBox5.Name = "TextBox5"
Me.TextBox5.Size = New System.Drawing.Size(40, 21)
Me.TextBox5.TabIndex = 34
Me.TextBox5.Text = "150"
'
'Label6
'
Me.Label6.Location = New System.Drawing.Point(480, 64)
Me.Label6.Name = "Label6"
Me.Label6.Size = New System.Drawing.Size(32, 16)
Me.Label6.TabIndex = 35
Me.Label6.Text = "旋转"
'
'VScrollBar1
'
Me.VScrollBar1.LargeChange = 30
Me.VScrollBar1.Location = New System.Drawing.Point(480, 88)
Me.VScrollBar1.Maximum = 628
Me.VScrollBar1.Name = "VScrollBar1"
Me.VScrollBar1.Size = New System.Drawing.Size(24, 280)
Me.VScrollBar1.TabIndex = 36
'
'Label7
'
Me.Label7.Location = New System.Drawing.Point(16, 40)
Me.Label7.Name = "Label7"
Me.Label7.Size = New System.Drawing.Size(32, 16)
Me.Label7.TabIndex = 37
Me.Label7.Text = "颜色"
'
'Label8
'
Me.Label8.Location = New System.Drawing.Point(136, 40)
Me.Label8.Name = "Label8"
Me.Label8.Size = New System.Drawing.Size(32, 16)
Me.Label8.TabIndex = 39
Me.Label8.Text = "宽度"
'
'TextBox7
'
Me.TextBox7.Location = New System.Drawing.Point(168, 32)
Me.TextBox7.Name = "TextBox7"
Me.TextBox7.Size = New System.Drawing.Size(40, 21)
Me.TextBox7.TabIndex = 40
Me.TextBox7.Text = "2"
'
'Button2
'
Me.Button2.Location = New System.Drawing.Point(64, 32)
Me.Button2.Name = "Button2"
Me.Button2.Size = New System.Drawing.Size(64, 24)
Me.Button2.TabIndex = 43
Me.Button2.Text = "选择"
'
'Form2
'
Me.AutoScaleBaseSize = New System.Drawing.Size(6, 14)
Me.ClientSize = New System.Drawing.Size(568, 405)
Me.Controls.Add(Me.Button2)
Me.Controls.Add(Me.TextBox7)
Me.Controls.Add(Me.Label8)
Me.Controls.Add(Me.Label7)
Me.Controls.Add(Me.VScrollBar1)
Me.Controls.Add(Me.Label6)
Me.Controls.Add(Me.TextBox5)
Me.Controls.Add(Me.Label5)
Me.Controls.Add(Me.TextBox4)
Me.Controls.Add(Me.Label4)
Me.Controls.Add(Me.TextBox3)
Me.Controls.Add(Me.Label3)
Me.Controls.Add(Me.TextBox2)
Me.Controls.Add(Me.Label2)
Me.Controls.Add(Me.Label1)
Me.Controls.Add(Me.TextBox1)
Me.Controls.Add(Me.PictureBox1)
Me.Controls.Add(Me.Button1)
Me.Name = "Form2"
Me.Text = "Form2"
Me.ResumeLayout(False)
End Sub
#End Region
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
drawit()
End Sub
Private Sub VScrollBar1_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles VScrollBar1.Scroll
drawit()
End Sub
Sub drawit()
penA.Width = CInt(TextBox7.Text)
PictureBox1.Image = New Bitmap(PictureBox1.Width, PictureBox1.Height)
DrawAngle(CLng(TextBox1.Text), CLng(TextBox2.Text), PictureBox1.Image, CLng(TextBox4.Text), CLng(TextBox5.Text), CLng(TextBox3.Text), VScrollBar1.Value / 10, penA)
End Sub
Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
penA = New Pen(Color.Red, 2)
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
If ColorDialog1.ShowDialog() = DialogResult.OK Then
penA.Color = ColorDialog1.Color
Button2.BackColor = penA.Color
End If
End Sub
End Class
出处:https://www.cnblogs.com/a11s/archive/2005/11/08/271150.html
计划是做魔法阵生成器的,后来仔细研究,需要大量的解析几何 数据结构 拼凑算法 随机算法 等等相关内容,所以不可能一次性解决问题了.所以发来当前进度描述一下过程以及想法.不一定能坚持写下去,到了后面的规则制定我头都大了.
--------------------------------------------------------------------------
用途:计算2D飞行游戏弹道,比如彩京那样的,放置游戏人物,屏幕保护,媒体播放器的视觉效果.
一个6边形,根据r扩散.取r两次.则有两个顶点列表.根据这两个停电列表可以表示弹道轨迹.然后旋转魔法阵,得到新的顶点列表,重复上述操作,可以得到任意发散的子弹图形
如果对两个子弹的弹道加上初始速度以及加速度,则可以表示变速直线运动,创造更华丽的子弹组合效果.
如果有了随机生成魔法阵算法,理论上游戏人物的初始位置排列都可以生成
虽然可以随机出现,但是如果用魔法阵顶点来做,会更有规律,生成的敌人组合排列更强,更加合理.因为魔法阵的生成都是有规律的,攻击型的图形表示可以放攻击型人物等等
因为牵扯随机算法,就是给出要求("比如咒语"),然后根据条件生成魔法阵的过程,就是要求根据"指定规则"后的映射
比如你给出一系列条件:攻击型5个,防御性一个,防御为主,同时复杂程度不超过N(魔法阵外层常量)....其他条件等等.然后根据算法,提取出数字,用作权值.生成魔法阵
N的取得是根据权值而定,就是N越大,魔法阵面积越大,外围图形越多(有隐形的辅助线) 而且如果敌人有人死亡,比如攻击的减少了一个,而且还是防御为主..那么再次带入还能生成新的魔法阵 重新排列防守阵型
强烈怀疑,一开始提出魔法阵的人,绝对不是因为好看!!只不过没有人认真研究罢了.这个很像八卦阵的,全都是数学以及数据关系
---------------------------------------------------------------------------
不废话了...
魔法阵生成系统的第一步 画一个正N角星
这个是基础的基础,正N角星包含正N边形,当N大于一定程度的时候可以近似表示圆,我们需要的顶点列表都可以被线性表描述出来,从而根据下标筛选所需的点.
对于正N角星,基础就是所在外接圆,然后通过极坐标->平面坐标转化求出顶点
这个就很简单了,高中内容
-------------------极坐标 到 平面坐标的转化--------------
Function Trans(ByVal jizuobiao As CAPI, Optional ByVal StartX As Integer = CStartX, Optional ByVal StartY As Integer = CStartY) As System.Drawing.Point
Dim P As System.Drawing.Point
'P(x,y)就是极坐标的 (Sin a)x 半径r 以及cos a x半径r
P.X = StartX + CLng(Math.Sin(jizuobiao.a) * jizuobiao.r)
P.Y = StartY + CLng(Math.Cos(jizuobiao.a) * jizuobiao.r)
Trans = P
End Function
----------------------------------------------------------------------
另外微软提供的arraylist似乎没有环形链表,尝试用他的queuq的时候,也不好改动,于是我索性干脆自己写了一个.其中包含以下要素:
-------------------------------
Public Class Node
'下一个节点
Public NextNode As Node
Public Container As RoundQueue
'上一个节点
Public PrevNode As Node
'元素信息,用Object表示
Public objData As Object
Public visitFlas As Integer
'插入节点
Public Function InsertNextByData(ByRef d As Object) As Node
Public Sub deleteNode()
Protected Overrides Sub Finalize()
End Class
Public Class RoundQueue
'Public EnableBack As Boolean
'虚拟的头节点
Public Root As Node
Public TotalNodes As Long '总数
Public CurrentNode As Node '当前指针
Public Sub New()
Public Sub New(ByRef L As ArrayList)
Public Function InsertNode(ByRef tarNode As Node, ByRef newNode As Node) As Node
Public Function InsertNode(ByRef tarNode As Node, ByRef newNode As Node, ByRef DataOfNewNode As Object)
Public Function MovePrev() As Node
Public Property GetData() As Object
Protected Overrides Sub Finalize()
Public Sub Dispose()
End Class
--------------------------------------------------
有了以上材料作为基础,开始研究算法.
网上找到的大部分都是LOGO语言的,没办法,人家天生适合画这个.
给出函数
DrawAngle(ByVal Num As Long, ByVal Steps As Long, ByRef map As Bitmap, ByVal x As Long, ByVal y As Long, ByVal r As Long, ByVal basea As Single, ByVal penA As Drawing.Pen)
提供角的数量,跨越点数,目标图像,圆心半径起始角度(用于旋转),以及画笔(颜色,粗细)绘制图形
1 所有的大于2的奇数的正N角星都能一笔画出
(也就是我们可以一直用.nextnode来画)
2 除了六角星以外 所有大于3的正N角星都能一笔画出
(一笔画出就是没有跳跃间断点)
3 大于5的正N角星,会有 ((边数-1)/2)上取整种有效画法
不仅仅是一种画法,当边数等于0或者自身的时候无意义,重复的图形无意义
4 间断点位置,(当角的数量/间隔点差(包含自身))=K的余数为0的点就是断点.
5 当断点出现的时候,当前图形就是基本图形,整个图形在此基础上错位 K次就是整个图形
6 基本图形错位K次的结果不会有任何重复线段以及顶点,而且可以遍历整个节点
以下以正8角星为例(3,4,5,6都有特例,所以不好办) 如图
------------------------------------
算法:
1 创建m的元素的数组
2 根据m的个数,取得间隔的角度a
3 根据极坐标转化,得到第一个顶点的位置
4 依次类推取得全部顶点
5 将顶点加入环形链表(严格的说,不算队列)
6 绘制,检测错位
--------------
For i = 1 To RQ.TotalNodes
If RQ.CurrentNode.visitFlas = 1 And GetNextNNode(RQ.CurrentNode, Steps).visitFlas = 1 Then
'如果下一个节点的下一个节点已经访问那么
RQ.MoveNext()
If i < RQ.TotalNodes - 1 Then i = i - 1
Else
g.DrawLine(penA, RQ.CurrentNode.objData, MoveNextNNode(RQ.CurrentNode, Steps).objData)
RQ.CurrentNode.visitFlas = 1
End If
Next
-------------
最终效果:
源代码:
Module Module1
Function DrawAngle(ByVal Num As Long, ByVal Steps As Long, ByRef map As Bitmap, ByVal x As Long, ByVal y As Long, ByVal r As Long, ByVal basea As Single, ByVal penA As Drawing.Pen)
If map Is Nothing Then
Exit Function
End If
Dim g As System.Drawing.Graphics
g = g.FromImage(map)
Dim RQ As RoundQueue = CreatePointQueueA(x, y, r, Num, basea)
Dim i As Long
''''''''' Draw
For i = 1 To RQ.TotalNodes
If RQ.CurrentNode.visitFlas = 1 And GetNextNNode(RQ.CurrentNode, Steps).visitFlas = 1 Then
'如果下一个节点的下一个节点已经访问那么
RQ.MoveNext()
If i < RQ.TotalNodes - 1 Then i = i - 1
Else
g.DrawLine(penA, RQ.CurrentNode.objData, MoveNextNNode(RQ.CurrentNode, Steps).objData)
RQ.CurrentNode.visitFlas = 1
End If
Next
End Function
Sub DrawLine(ByVal fromPoint As Drawing.Point, ByVal toPoint As Drawing.Point)
End Sub
Function GetNextNNode(ByVal tarnode As Node, ByVal n As Long) As Node
Dim i
For i = 1 To n
tarnode = tarnode.NextNode
Next
Return tarnode
End Function
Function MoveNextNNode(ByRef tarnode As Node, ByVal n As Long) As Node
Dim i
For i = 1 To n
tarnode = tarnode.NextNode
Next
Return tarnode
End Function
End Module
Public Class RoundQueue
'Public EnableBack As Boolean
'虚拟的头节点
Public Root As Node
Public TotalNodes As Long '总数
Public CurrentNode As Node '当前指针
''''''''
Public Sub New()
'新的根节点
Root = New Node
'全部指向自己
Root.PrevNode = Root
Root.NextNode = Root
'当前节点指向跟节点
CurrentNode = Root
Root.Container = Me
TotalNodes = 1
End Sub
Public Sub New(ByRef L As ArrayList)
Me.New()
If L.Count < 0 Then Exit Sub
Root.objData = L.Item(0)
Dim i As Long
For i = 1 To L.Count - 1
Dim cn As Node
If i = 1 Then
cn = InsertNode(Root, New Node, L.Item(i))
Else
cn = InsertNode(CurrentNode, New Node, L.Item(i))
End If
cn.objData = cn.objData
CurrentNode.NextNode = cn
Next
Root = CurrentNode
Root = Root.NextNode
'最后一个节点指向头节点
'CurrentNode.PrevNode = Root
'头节点的上一个节点指向最后一个
'Root.PrevNode = CurrentNode
'指针移动到开始
'CurrentNode = Root
End Sub
Public Function InsertNode(ByRef tarNode As Node, ByRef newNode As Node) As Node
'保存旧的数据
Dim oldnode As Node
oldnode = tarNode.NextNode
'连接新的数据
tarNode.NextNode = newNode
newNode.PrevNode = tarNode
newNode.NextNode = oldnode
'连接旧的数据
oldnode.PrevNode = newNode
'返回刚刚插入的Node
TotalNodes += 1
newNode.Container = Me
Return newNode
End Function
Public Function InsertNode(ByRef tarNode As Node, ByRef newNode As Node, ByRef DataOfNewNode As Object)
'保存旧的数据
Dim oldnode As Node
oldnode = tarNode.NextNode
'连接新的数据
tarNode.NextNode = newNode
newNode.PrevNode = tarNode
newNode.NextNode = oldnode
'连接旧的数据
oldnode.PrevNode = newNode
newNode.objData = DataOfNewNode
newNode.Container = Me
TotalNodes += 1
Return newNode
End Function
Public Function MoveNext() As Node
CurrentNode = CurrentNode.NextNode
End Function
Public Function MovePrev() As Node
CurrentNode = CurrentNode.PrevNode
End Function
Public Property GetData() As Object
Get
Return CurrentNode.objData
End Get
Set(ByVal Value As Object)
CurrentNode.objData = Value
End Set
End Property
Protected Overrides Sub Finalize()
MyBase.Finalize()
End Sub
Public Sub Dispose()
Finalize()
End Sub
End Class
Public Class Node
'下一个节点
Public NextNode As Node
Public Container As RoundQueue
'上一个节点
Public PrevNode As Node
'元素信息,用Object表示
Public objData As Object
Public visitFlas As Integer
'插入节点
Public Function InsertNextByData(ByRef d As Object) As Node
Dim n As New Node 'new
n.objData = d 'add data
n.PrevNode = Me '确定前驱
Me.NextNode = n '自己确定后继
Container.TotalNodes += 1
Return n '返回
End Function
Public Sub deleteNode()
'Dim t As Node
't = Me.NextNode
If Container.TotalNodes <= 1 Then
Me.Finalize()
Container.Dispose()
End If
Me.PrevNode.NextNode = Me.NextNode
Me.NextNode.PrevNode = Me.PrevNode
Me.Finalize()
End Sub
Protected Overrides Sub Finalize()
MyBase.Finalize()
End Sub
End Class
Public Class Form1
Inherits System.Windows.Forms.Form
#Region " Windows 窗体设计器生成的代码 "
Public Sub New()
MyBase.New()
'该调用是 Windows 窗体设计器所必需的。
InitializeComponent()
'在 InitializeComponent() 调用之后添加任何初始化
End Sub
'窗体重写 dispose 以清理组件列表。
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
'Windows 窗体设计器所必需的
Private components As System.ComponentModel.IContainer
'注意: 以下过程是 Windows 窗体设计器所必需的
'可以使用 Windows 窗体设计器修改此过程。
'不要使用代码编辑器修改它。
Friend WithEvents Button1 As System.Windows.Forms.Button
Friend WithEvents ListBox1 As System.Windows.Forms.ListBox
Friend WithEvents Button2 As System.Windows.Forms.Button
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.Button1 = New System.Windows.Forms.Button
Me.ListBox1 = New System.Windows.Forms.ListBox
Me.Button2 = New System.Windows.Forms.Button
Me.SuspendLayout()
'
'Button1
'
Me.Button1.Location = New System.Drawing.Point(360, 96)
Me.Button1.Name = "Button1"
Me.Button1.Size = New System.Drawing.Size(120, 48)
Me.Button1.TabIndex = 0
Me.Button1.Text = "next"
'
'ListBox1
'
Me.ListBox1.ItemHeight = 12
Me.ListBox1.Location = New System.Drawing.Point(16, 8)
Me.ListBox1.Name = "ListBox1"
Me.ListBox1.Size = New System.Drawing.Size(200, 316)
Me.ListBox1.TabIndex = 1
'
'Button2
'
Me.Button2.Location = New System.Drawing.Point(360, 168)
Me.Button2.Name = "Button2"
Me.Button2.Size = New System.Drawing.Size(120, 48)
Me.Button2.TabIndex = 2
Me.Button2.Text = "prve"
'
'Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(6, 14)
Me.ClientSize = New System.Drawing.Size(496, 373)
Me.Controls.Add(Me.Button2)
Me.Controls.Add(Me.ListBox1)
Me.Controls.Add(Me.Button1)
Me.Name = "Form1"
Me.Text = "Form1"
Me.ResumeLayout(False)
End Sub
#End Region
Dim lianbiao As RoundQueue
Dim arr As New ArrayList
Dim i As Long
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
ListBox1.Items.Clear()
For i = 1 To 30
ListBox1.Items.Add(lianbiao.CurrentNode.objData)
lianbiao.CurrentNode = lianbiao.CurrentNode.NextNode
Next
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
For i = 1 To 7
arr.Add("第" + i.ToString + "个")
Next
lianbiao = New RoundQueue(arr)
lianbiao.CurrentNode = lianbiao.Root
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
ListBox1.Items.Clear()
For i = 1 To 30
ListBox1.Items.Add(lianbiao.CurrentNode.objData)
lianbiao.CurrentNode = lianbiao.CurrentNode.PrevNode
Next
End Sub
End Class
Module Module2
Public Const PI = 3.141592654
Public Const CStartX = 200
Public Const CStartY = 200
Public Structure CAPI
Public a As Single
Public r As Single
End Structure
Function Trans(ByVal jizuobiao As CAPI, Optional ByVal StartX As Integer = CStartX, Optional ByVal StartY As Integer = CStartY) As System.Drawing.Point
Dim P As System.Drawing.Point
P.X = StartX + CLng(Math.Sin(jizuobiao.a) * jizuobiao.r)
P.Y = StartY + CLng(Math.Cos(jizuobiao.a) * jizuobiao.r)
Trans = P
End Function
Public Function CreatePointQueueA(ByVal x As Long, ByVal y As Long, ByVal r As Long, ByVal itemscount As Long, Optional ByVal Basea As Single = 0) As RoundQueue
Dim q As New RoundQueue
Dim a As Single
Dim j As CAPI
a = 2 * Math.PI / itemscount
Dim PointList(itemscount - 1) As Drawing.Point
'''Now Create list
Dim i As Long
For i = 0 To itemscount - 1
j.a = Basea + a * (i + 1)
j.r = r
PointList(i) = Trans(j, x, y)
Next
'''enqueue
Dim RQ As New RoundQueue(New ArrayList(PointList))
Return RQ
End Function
End Module
Public Class Form2
Inherits System.Windows.Forms.Form
Dim penA As Pen
#Region " Windows 窗体设计器生成的代码 "
Public Sub New()
MyBase.New()
'该调用是 Windows 窗体设计器所必需的。
InitializeComponent()
'在 InitializeComponent() 调用之后添加任何初始化
End Sub
'窗体重写 dispose 以清理组件列表。
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
'Windows 窗体设计器所必需的
Private components As System.ComponentModel.IContainer
'注意: 以下过程是 Windows 窗体设计器所必需的
'可以使用 Windows 窗体设计器修改此过程。
'不要使用代码编辑器修改它。
Friend WithEvents Button1 As System.Windows.Forms.Button
Friend WithEvents PictureBox1 As System.Windows.Forms.PictureBox
Friend WithEvents TextBox1 As System.Windows.Forms.TextBox
Friend WithEvents Label1 As System.Windows.Forms.Label
Friend WithEvents Label2 As System.Windows.Forms.Label
Friend WithEvents TextBox2 As System.Windows.Forms.TextBox
Friend WithEvents Label3 As System.Windows.Forms.Label
Friend WithEvents TextBox3 As System.Windows.Forms.TextBox
Friend WithEvents Label4 As System.Windows.Forms.Label
Friend WithEvents TextBox4 As System.Windows.Forms.TextBox
Friend WithEvents Label5 As System.Windows.Forms.Label
Friend WithEvents TextBox5 As System.Windows.Forms.TextBox
Friend WithEvents Label6 As System.Windows.Forms.Label
Friend WithEvents VScrollBar1 As System.Windows.Forms.VScrollBar
Friend WithEvents Label7 As System.Windows.Forms.Label
Friend WithEvents Label8 As System.Windows.Forms.Label
Friend WithEvents TextBox7 As System.Windows.Forms.TextBox
Friend WithEvents Button2 As System.Windows.Forms.Button
Friend WithEvents ColorDialog1 As System.Windows.Forms.ColorDialog
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.Button1 = New System.Windows.Forms.Button
Me.PictureBox1 = New System.Windows.Forms.PictureBox
Me.TextBox1 = New System.Windows.Forms.TextBox
Me.Label1 = New System.Windows.Forms.Label
Me.Label2 = New System.Windows.Forms.Label
Me.TextBox2 = New System.Windows.Forms.TextBox
Me.Label3 = New System.Windows.Forms.Label
Me.TextBox3 = New System.Windows.Forms.TextBox
Me.Label4 = New System.Windows.Forms.Label
Me.TextBox4 = New System.Windows.Forms.TextBox
Me.Label5 = New System.Windows.Forms.Label
Me.TextBox5 = New System.Windows.Forms.TextBox
Me.Label6 = New System.Windows.Forms.Label
Me.VScrollBar1 = New System.Windows.Forms.VScrollBar
Me.Label7 = New System.Windows.Forms.Label
Me.Label8 = New System.Windows.Forms.Label
Me.TextBox7 = New System.Windows.Forms.TextBox
Me.Button2 = New System.Windows.Forms.Button
Me.ColorDialog1 = New System.Windows.Forms.ColorDialog
Me.SuspendLayout()
'
'Button1
'
Me.Button1.Location = New System.Drawing.Point(424, 8)
Me.Button1.Name = "Button1"
Me.Button1.Size = New System.Drawing.Size(104, 32)
Me.Button1.TabIndex = 0
Me.Button1.Text = "Draw It!!"
'
'PictureBox1
'
Me.PictureBox1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
Me.PictureBox1.Location = New System.Drawing.Point(8, 64)
Me.PictureBox1.Name = "PictureBox1"
Me.PictureBox1.Size = New System.Drawing.Size(440, 328)
Me.PictureBox1.TabIndex = 1
Me.PictureBox1.TabStop = False
'
'TextBox1
'
Me.TextBox1.Location = New System.Drawing.Point(72, 8)
Me.TextBox1.Name = "TextBox1"
Me.TextBox1.Size = New System.Drawing.Size(40, 21)
Me.TextBox1.TabIndex = 2
Me.TextBox1.Text = "7"
'
'Label1
'
Me.Label1.Location = New System.Drawing.Point(16, 16)
Me.Label1.Name = "Label1"
Me.Label1.Size = New System.Drawing.Size(56, 16)
Me.Label1.TabIndex = 3
Me.Label1.Text = "角的数量"
'
'Label2
'
Me.Label2.Location = New System.Drawing.Point(120, 16)
Me.Label2.Name = "Label2"
Me.Label2.Size = New System.Drawing.Size(32, 16)
Me.Label2.TabIndex = 4
Me.Label2.Text = "间隔"
'
'TextBox2
'
Me.TextBox2.Location = New System.Drawing.Point(152, 8)
Me.TextBox2.Name = "TextBox2"
Me.TextBox2.Size = New System.Drawing.Size(40, 21)
Me.TextBox2.TabIndex = 5
Me.TextBox2.Text = "1"
'
'Label3
'
Me.Label3.Location = New System.Drawing.Point(200, 16)
Me.Label3.Name = "Label3"
Me.Label3.Size = New System.Drawing.Size(32, 16)
Me.Label3.TabIndex = 6
Me.Label3.Text = "半径"
'
'TextBox3
'
Me.TextBox3.Location = New System.Drawing.Point(232, 8)
Me.TextBox3.Name = "TextBox3"
Me.TextBox3.Size = New System.Drawing.Size(40, 21)
Me.TextBox3.TabIndex = 30
Me.TextBox3.Text = "50"
'
'Label4
'
Me.Label4.Location = New System.Drawing.Point(280, 16)
Me.Label4.Name = "Label4"
Me.Label4.Size = New System.Drawing.Size(8, 16)
Me.Label4.TabIndex = 31
Me.Label4.Text = "X"
'
'TextBox4
'
Me.TextBox4.Location = New System.Drawing.Point(296, 8)
Me.TextBox4.Name = "TextBox4"
Me.TextBox4.Size = New System.Drawing.Size(40, 21)
Me.TextBox4.TabIndex = 32
Me.TextBox4.Text = "200"
'
'Label5
'
Me.Label5.Location = New System.Drawing.Point(336, 16)
Me.Label5.Name = "Label5"
Me.Label5.Size = New System.Drawing.Size(8, 16)
Me.Label5.TabIndex = 33
Me.Label5.Text = "Y"
'
'TextBox5
'
Me.TextBox5.Location = New System.Drawing.Point(352, 8)
Me.TextBox5.Name = "TextBox5"
Me.TextBox5.Size = New System.Drawing.Size(40, 21)
Me.TextBox5.TabIndex = 34
Me.TextBox5.Text = "150"
'
'Label6
'
Me.Label6.Location = New System.Drawing.Point(480, 64)
Me.Label6.Name = "Label6"
Me.Label6.Size = New System.Drawing.Size(32, 16)
Me.Label6.TabIndex = 35
Me.Label6.Text = "旋转"
'
'VScrollBar1
'
Me.VScrollBar1.LargeChange = 30
Me.VScrollBar1.Location = New System.Drawing.Point(480, 88)
Me.VScrollBar1.Maximum = 628
Me.VScrollBar1.Name = "VScrollBar1"
Me.VScrollBar1.Size = New System.Drawing.Size(24, 280)
Me.VScrollBar1.TabIndex = 36
'
'Label7
'
Me.Label7.Location = New System.Drawing.Point(16, 40)
Me.Label7.Name = "Label7"
Me.Label7.Size = New System.Drawing.Size(32, 16)
Me.Label7.TabIndex = 37
Me.Label7.Text = "颜色"
'
'Label8
'
Me.Label8.Location = New System.Drawing.Point(136, 40)
Me.Label8.Name = "Label8"
Me.Label8.Size = New System.Drawing.Size(32, 16)
Me.Label8.TabIndex = 39
Me.Label8.Text = "宽度"
'
'TextBox7
'
Me.TextBox7.Location = New System.Drawing.Point(168, 32)
Me.TextBox7.Name = "TextBox7"
Me.TextBox7.Size = New System.Drawing.Size(40, 21)
Me.TextBox7.TabIndex = 40
Me.TextBox7.Text = "2"
'
'Button2
'
Me.Button2.Location = New System.Drawing.Point(64, 32)
Me.Button2.Name = "Button2"
Me.Button2.Size = New System.Drawing.Size(64, 24)
Me.Button2.TabIndex = 43
Me.Button2.Text = "选择"
'
'Form2
'
Me.AutoScaleBaseSize = New System.Drawing.Size(6, 14)
Me.ClientSize = New System.Drawing.Size(568, 405)
Me.Controls.Add(Me.Button2)
Me.Controls.Add(Me.TextBox7)
Me.Controls.Add(Me.Label8)
Me.Controls.Add(Me.Label7)
Me.Controls.Add(Me.VScrollBar1)
Me.Controls.Add(Me.Label6)
Me.Controls.Add(Me.TextBox5)
Me.Controls.Add(Me.Label5)
Me.Controls.Add(Me.TextBox4)
Me.Controls.Add(Me.Label4)
Me.Controls.Add(Me.TextBox3)
Me.Controls.Add(Me.Label3)
Me.Controls.Add(Me.TextBox2)
Me.Controls.Add(Me.Label2)
Me.Controls.Add(Me.Label1)
Me.Controls.Add(Me.TextBox1)
Me.Controls.Add(Me.PictureBox1)
Me.Controls.Add(Me.Button1)
Me.Name = "Form2"
Me.Text = "Form2"
Me.ResumeLayout(False)
End Sub
#End Region
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
drawit()
End Sub
Private Sub VScrollBar1_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles VScrollBar1.Scroll
drawit()
End Sub
Sub drawit()
penA.Width = CInt(TextBox7.Text)
PictureBox1.Image = New Bitmap(PictureBox1.Width, PictureBox1.Height)
DrawAngle(CLng(TextBox1.Text), CLng(TextBox2.Text), PictureBox1.Image, CLng(TextBox4.Text), CLng(TextBox5.Text), CLng(TextBox3.Text), VScrollBar1.Value / 10, penA)
End Sub
Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
penA = New Pen(Color.Red, 2)
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
If ColorDialog1.ShowDialog() = DialogResult.OK Then
penA.Color = ColorDialog1.Color
Button2.BackColor = penA.Color
End If
End Sub
End Class
出处:https://www.cnblogs.com/a11s/archive/2005/11/08/271150.html
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式