You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1171 lines
37 KiB
1171 lines
37 KiB
Build1=Default,b4a.bitmapdrawer2
|
|
File1=bitmapdrawer.bal
|
|
FileGroup1=Default Group
|
|
Group=Default Group
|
|
Library1=core
|
|
Library2=bitmapcreator
|
|
Library3=xui
|
|
Library4=xui2d
|
|
Library5=javaobject
|
|
Library6=gps
|
|
Library7=runtimepermissions
|
|
ManifestCode='This code will be applied to the manifest file during compilation.~\n~'You do not need to modify it in most cases.~\n~'See this link for for more information: https://www.b4x.com/forum/showthread.php?p=78136~\n~AddManifestText(~\n~<uses-sdk android:minSdkVersion="5" android:targetSdkVersion="28"/>~\n~<supports-screens android:largeScreens="true" ~\n~ android:normalScreens="true" ~\n~ android:smallScreens="true" ~\n~ android:anyDensity="true"/>)~\n~SetApplicationAttribute(android:icon, "@drawable/icon")~\n~SetApplicationAttribute(android:label, "$LABEL$")~\n~CreateResourceFromFile(Macro, Themes.DarkTheme)~\n~'End of default text.~\n~
|
|
Module1=|relative|..\sideextra
|
|
Module2=Starter
|
|
NumberOfFiles=1
|
|
NumberOfLibraries=7
|
|
NumberOfModules=2
|
|
Version=9.9
|
|
@EndOfDesignText@
|
|
#Region Project Attributes
|
|
#ApplicationLabel: b4amod
|
|
#VersionCode: 1
|
|
#VersionName:
|
|
'SupportedOrientations possible values: unspecified, landscape or portrait.
|
|
#SupportedOrientations: unspecified
|
|
#CanInstallToExternalStorage: False
|
|
#End Region
|
|
|
|
#Region Activity Attributes
|
|
#FullScreen: False
|
|
#IncludeTitle: True
|
|
#End Region
|
|
|
|
'todo
|
|
'set location start to center of bc
|
|
'turn on dads bc rotation bmc2
|
|
'current position in x,y=origin(x,y)+delta(x,y) times (current lat long - origin lat long
|
|
'increae bc size
|
|
'fire iteration on location changed, not on 1000ms timer
|
|
'breaking code up into seperate files"b4a break
|
|
''wait for could be removed in its entirety and program should still be good
|
|
|
|
|
|
|
|
Sub Process_globals
|
|
|
|
End Sub
|
|
|
|
Sub Globals
|
|
Type coordX (y As Float,x As Float)
|
|
Type coordxx (lat As Float,lng As Float)
|
|
Private mapsize As coordX
|
|
'Private fx As JFX
|
|
'Private MainForm As Form
|
|
Private xui As XUI
|
|
Private timerx As Int
|
|
Private rectanglewholeb4x As B4XRect
|
|
|
|
Private pnlGraph As Panel
|
|
Private cvsGraph As B4XCanvas
|
|
Private imvGraph As ImageView
|
|
Private pthGraph As BCPath
|
|
Private bmcGraph As BitmapCreator
|
|
Private bmc2ndgraph As BitmapCreator
|
|
|
|
Private PointX(6), PointY(6) As Double
|
|
' Private BtnClear As B4XView
|
|
' Private BtnDraw As B4XView
|
|
' Private BtnFast As B4XView
|
|
' Private BtnStop As B4XView
|
|
' Private BtnSlow As B4XView
|
|
' Private BtnLeft As B4XView
|
|
' Private BtnRight As B4XView
|
|
|
|
Private timeriterate As Timer
|
|
Private xpos, ypos, xposnew, yposnew As Float
|
|
|
|
Private xposleft, yposleft, xposright, yposright, widthsection As Float
|
|
Private velocity, heading, headingrate As Float
|
|
' Private BtnActivateTimerTick As B4XView
|
|
|
|
'/////
|
|
Private tractor1 As coordX 'location of tractor
|
|
Private trailer1 As coordX 'location of center of trailer
|
|
Private tractor0 As coordX 'location of tractor
|
|
Private trailer0 As coordX 'location of center of trailer
|
|
Private hitch1 As coordX 'location of tractor hitch
|
|
Private Offset_hitch As Float
|
|
Private offset_trailertoboom As Float
|
|
Private offset_trailerlength As Float
|
|
Private boomsectionwidth(4) As Float 'center is 1
|
|
Private vector1 As coordX
|
|
Private vectorlength1 As Float
|
|
Private boompoint0 As coordX
|
|
Private boompoint00 As coordX
|
|
Private boompoint01 As coordX 'leading point
|
|
Private boompoint1 As coordX
|
|
Private boompoint10 As coordX
|
|
Private boompoint11 As coordX
|
|
Private boompoint2 As coordX
|
|
Private boompoint20 As coordX
|
|
Private boompoint21 As coordX
|
|
Private boompoint3 As coordX
|
|
Private boompoint30 As coordX
|
|
Private boompoint31 As coordX
|
|
Private boompoint4 As coordX
|
|
Private boompoint40 As coordX
|
|
Private boompoint41 As coordX
|
|
Private boompoint5 As coordX
|
|
Private boompoint50 As coordX
|
|
Private boompoint51 As coordX 'leading point
|
|
Private boomcenter1 As coordX
|
|
Private unitvector1 As coordX
|
|
Private boomcolor(5) As Int
|
|
' Private boom1color As Int
|
|
' Private boom2color As Int
|
|
' Private boom3color As Int
|
|
' Private boom4color As Int
|
|
|
|
|
|
|
|
|
|
Public x1 As Int
|
|
Public x2 As Int
|
|
Public y1 As Int
|
|
Public y2 As Int
|
|
|
|
Public P1 As coordX
|
|
Public P2 As coordX
|
|
Public P3 As coordX
|
|
Public P4 As coordX
|
|
|
|
Public a0 As coordX
|
|
Public a1 As coordX
|
|
Public b0 As coordX
|
|
Public b1 As coordX
|
|
|
|
Public rectanglewhole As Rect
|
|
Public canvas1 As Canvas
|
|
Private rp As RuntimePermissions
|
|
|
|
Dim displayoutlines As Boolean
|
|
Dim displayfill As Boolean
|
|
|
|
'Public boomcolour As String
|
|
Public boomon As Boolean
|
|
Private Panel1 As B4XView
|
|
|
|
Type coord (lat As Long,lng As Long)
|
|
|
|
' Private location1 As Location
|
|
Public origin As coordxx
|
|
Private deltalat As Float
|
|
Private deltalong As Float
|
|
Private xposorigin As Int
|
|
Private yposorigin As Int
|
|
Private b4arect1 As B4XRect
|
|
Private section1colour As Panel
|
|
Private section2colour As Panel
|
|
Private section3colour As Panel
|
|
Private section4colour As Panel
|
|
Private section5colour As Panel
|
|
End Sub
|
|
|
|
Sub activity_create (FirstTime As Boolean)'(Form1 As Form, Args() As String)
|
|
'MainForm = Form1
|
|
'MainForm.RootPane.LoadLayout("Main") 'Load the layout file.
|
|
'MainForm.Show
|
|
Activity.LoadLayout("bitmapdrawer.bal")
|
|
'timeriterate.Initialize("IterateTimer",1000)
|
|
'timeriterate.Enabled = True
|
|
b4arect1.Initialize(0,0,imvGraph.Width,imvGraph.Height)
|
|
mapsize.Initialize
|
|
mapsize.x=1200
|
|
mapsize.y=1200
|
|
xposorigin=mapsize.x/2
|
|
yposorigin=mapsize.y/2
|
|
|
|
xpos = xposorigin
|
|
ypos = yposorigin
|
|
|
|
|
|
unitvector1.Initialize
|
|
Offset_hitch = 0
|
|
offset_trailerlength = 1
|
|
offset_trailertoboom = 1
|
|
boomsectionwidth(1) = 8
|
|
boomsectionwidth(2) = 8
|
|
boomsectionwidth(3) = 8
|
|
|
|
rp.CheckAndRequest(rp.PERMISSION_ACCESS_FINE_LOCATION)
|
|
a0.Initialize
|
|
a1.Initialize
|
|
b0.Initialize
|
|
b1.Initialize
|
|
trailer0.x=xpos
|
|
trailer0.y=ypos-Offset_hitch-offset_trailerlength
|
|
velocity = 10
|
|
heading = 180
|
|
' bmcGraph..b
|
|
boompoint50.Initialize
|
|
boompoint5.Initialize
|
|
boompoint0.Initialize
|
|
boompoint00.Initialize
|
|
boompoint51.Initialize
|
|
boompoint01.Initialize
|
|
boompoint1.Initialize
|
|
boompoint10.Initialize
|
|
boompoint11.Initialize
|
|
boompoint2.Initialize
|
|
boompoint20.Initialize
|
|
boompoint21.Initialize
|
|
boompoint3.Initialize
|
|
boompoint30.Initialize
|
|
boompoint31.Initialize
|
|
boompoint4.Initialize
|
|
boompoint40.Initialize
|
|
boompoint41.Initialize
|
|
boompoint00.x=0
|
|
boompoint50.x=0
|
|
boompoint10.x=0
|
|
boompoint20.x=0
|
|
boompoint30.x=0
|
|
boompoint40.x=0
|
|
headingrate = 0
|
|
widthsection = 100
|
|
cvsGraph.Initialize(imvGraph)
|
|
boomon=True
|
|
boomcolor(0)=xui.Color_Green
|
|
boomcolor(1)=xui.Color_Green
|
|
boomcolor(2)=xui.Color_Green
|
|
boomcolor(3)=xui.Color_Green
|
|
boomcolor(4)=xui.Color_Green
|
|
Initialize(1)
|
|
'location_center
|
|
Do While Starter.ValidGPS = False
|
|
Sleep (100)
|
|
Loop
|
|
''Log("a")
|
|
|
|
location_center
|
|
|
|
End Sub
|
|
|
|
Sub LocationChanged(Location1 As Location)'IterateTimer_Tick
|
|
If Starter.Location2.BearingValid = True Then
|
|
heading=Starter.Location2.Bearing
|
|
End If
|
|
'Log("b")
|
|
'heading = heading + headingrate
|
|
' If heading < 0 Then
|
|
' heading = heading + 360
|
|
'Else If heading >360 Then
|
|
' heading = heading - 360
|
|
'End If
|
|
timerx=DateTime.now
|
|
'Log("deltalong"&deltalong)
|
|
xposnew=xposorigin+deltalong*(Starter.Location2.Longitude-origin.lng)/2
|
|
yposnew=yposorigin+deltalat*(Starter.Location2.latitude-origin.lat)/2
|
|
'xposnew = xpos + velocity * SinD(heading)
|
|
'yposnew = ypos - velocity * CosD(heading)
|
|
Log("xposnew: " & NumberFormat(xposnew,0,0) & " yposnew: " & NumberFormat(yposnew,0,0) & " heading: " & NumberFormat(heading,0,0))
|
|
'bmcGraph.DrawLine(xpos,ypos,xposnew,yposnew,xui.Color_Black,10)
|
|
|
|
' xposright = xposnew + widthsection*CosD(heading)/2
|
|
' yposright = yposnew + widthsection*SinD(heading)/2
|
|
' xposleft = xposnew - widthsection*CosD(heading)/2
|
|
' yposleft = yposnew - widthsection*SinD(heading)/2
|
|
bmcGraph.DrawCircle(xposnew,yposnew,4,xui.Color_red,True,1)
|
|
'hiden by jack bmcGraph.DrawLine(xposleft,yposleft,xposright,yposright,xui.Color_Blue,4)
|
|
|
|
'///////
|
|
|
|
|
|
|
|
'convert all tractor positions to cartesian on our map
|
|
tractor0.x=xpos
|
|
tractor0.y=ypos
|
|
|
|
tractor1.x=xposnew
|
|
tractor1.y=yposnew
|
|
'find hitch position of tractor(1)
|
|
hitch1.x=tractor1.x-Offset_hitch*CosD(heading+90)
|
|
hitch1.y=tractor1.y-Offset_hitch*SinD(heading+90)
|
|
'Log(hitch1.x)
|
|
'Log(hitch1.y)
|
|
|
|
vector1.x = hitch1.x-trailer0.x
|
|
vector1.y = hitch1.y-trailer0.y
|
|
vectorlength1=Power(Power(vector1.x,2)+Power(vector1.y,2),.5)
|
|
unitvector1.x=vector1.x/vectorlength1
|
|
unitvector1.y=vector1.y/vectorlength1
|
|
trailer1.x=hitch1.x-vector1.x*offset_trailerlength/vectorlength1
|
|
trailer1.y=hitch1.y-vector1.y*offset_trailerlength/vectorlength1
|
|
boomcenter1.x=-unitvector1.x*offset_trailertoboom+trailer1.x
|
|
boomcenter1.y=-unitvector1.y*offset_trailertoboom+trailer1.y
|
|
'perpvect.x=vec.y
|
|
'perpvect.y=-vec.x
|
|
' Log("new1"&boompoint0)
|
|
' Log("old1"&boompoint00)
|
|
boompoint0.x=-(boomsectionwidth(1)/2+boomsectionwidth(2)+boomsectionwidth(3))*unitvector1.y+boomcenter1.x
|
|
boompoint0.y=-(boomsectionwidth(1)/2+boomsectionwidth(2)+boomsectionwidth(3))*-unitvector1.x+boomcenter1.y
|
|
boompoint01.x=boompoint0.x+ boompoint0.x-boompoint00.x
|
|
boompoint01.y=boompoint0.y+ boompoint0.y-boompoint00.y
|
|
boompoint1.x=-(boomsectionwidth(1)/2+boomsectionwidth(2))*unitvector1.y+boomcenter1.x
|
|
boompoint1.y=-(boomsectionwidth(1)/2+boomsectionwidth(2))*-unitvector1.x+boomcenter1.y
|
|
boompoint11.x=boompoint1.x+ boompoint1.x-boompoint10.x
|
|
boompoint11.y=boompoint1.y+ boompoint1.y-boompoint10.y
|
|
boompoint2.x=-(boomsectionwidth(1)/2)*unitvector1.y+boomcenter1.x
|
|
boompoint2.y=-(boomsectionwidth(1)/2)*-unitvector1.x+boomcenter1.y
|
|
boompoint21.x=boompoint2.x+ boompoint2.x-boompoint20.x
|
|
boompoint21.y=boompoint2.y+ boompoint2.y-boompoint20.y
|
|
boompoint3.x=(boomsectionwidth(1)/2)*unitvector1.y+boomcenter1.x
|
|
boompoint3.y=(boomsectionwidth(1)/2)*-unitvector1.x+boomcenter1.y
|
|
boompoint31.x=boompoint3.x+ boompoint3.x-boompoint30.x
|
|
boompoint31.y=boompoint3.y+ boompoint3.y-boompoint30.y
|
|
boompoint4.x=(boomsectionwidth(1)/2+boomsectionwidth(2))*unitvector1.y+boomcenter1.x
|
|
boompoint4.y=(boomsectionwidth(1)/2+boomsectionwidth(2))*-unitvector1.x+boomcenter1.y
|
|
boompoint41.x=boompoint4.x+ boompoint4.x-boompoint40.x
|
|
boompoint41.y=boompoint4.y+ boompoint4.y-boompoint40.y
|
|
boompoint5.x=(boomsectionwidth(1)/2+boomsectionwidth(2)+boomsectionwidth(3))*unitvector1.y+boomcenter1.x
|
|
boompoint5.y=(boomsectionwidth(1)/2+boomsectionwidth(2)+boomsectionwidth(3))*-unitvector1.x+boomcenter1.y
|
|
boompoint51.x=boompoint5.x+ boompoint5.x-boompoint50.x
|
|
boompoint51.y=boompoint5.y+ boompoint5.y-boompoint50.y
|
|
|
|
'boompoint51.x=boompoint5.x+ (boompoint0.x-boompoint00.x+boompoint5.x-boompoint50.x)/2
|
|
'boompoint51.y=boompoint5.y+ (boompoint0.y-boompoint00.y+boompoint5.y-boompoint50.y)/2
|
|
'boompoint01.x=boompoint0.x+ (boompoint0.x-boompoint00.x+boompoint5.x-boompoint50.x)/2
|
|
'boompoint01.y=boompoint0.y+ (boompoint0.y-boompoint00.y+boompoint5.y-boompoint50.y)/2
|
|
|
|
bmcGraph.DrawLine(boompoint0.x,boompoint0.y,boompoint1.x,boompoint1.y,xui.Color_Gray,1)
|
|
bmcGraph.DrawLine(boompoint1.x,boompoint1.y,boompoint2.x,boompoint2.y,xui.Color_Cyan,1)
|
|
bmcGraph.DrawLine(boompoint2.x,boompoint2.y,boompoint3.x,boompoint3.y,xui.Color_Green,1)
|
|
bmcGraph.DrawLine(boompoint3.x,boompoint3.y,boompoint4.x,boompoint4.y,xui.Color_Magenta,1)
|
|
bmcGraph.DrawLine(boompoint4.x,boompoint4.y,boompoint5.x,boompoint5.y,xui.Color_Black,1)
|
|
''Log(bmcGraph.GetColor(1,1))'(boompoint0.x+boompoint01.x+boompoint5.x+boompoint51.x)/4,(boompoint0.y+boompoint01.y+boompoint5.y+boompoint51.y)/4))
|
|
bmcGraph.DrawCircle(hitch1.x,hitch1.y,2,xui.Color_black,True,1)
|
|
trailer0.x=trailer1.x
|
|
trailer0.y=trailer1.y
|
|
If boompoint00.x <>0 Then
|
|
|
|
'Log("boomon"&boomon)
|
|
'If boomon=True Then
|
|
|
|
|
|
' Wait For(rectanglefiller(boompoint0, boompoint00, boompoint10, boompoint1,0)) complete '(result As Int)
|
|
' Wait For(rectanglefiller(boompoint1, boompoint10, boompoint20, boompoint2,1)) complete '(result As Int)
|
|
' Wait For(rectanglefiller(boompoint2, boompoint20, boompoint30, boompoint3,2)) complete '(result As Int)
|
|
' Wait For(rectanglefiller(boompoint3, boompoint30, boompoint40, boompoint4,3)) complete '(result As Int)
|
|
' Wait For(rectanglefiller(boompoint4, boompoint40, boompoint50, boompoint5,4)) complete '(result As Int)
|
|
' End If
|
|
' Wait For(rectanglechecker(boompoint01, boompoint0,boompoint1,boompoint11,0)) complete
|
|
' Wait For(rectanglechecker(boompoint11, boompoint1,boompoint2,boompoint21,1)) complete
|
|
' Wait For(rectanglechecker(boompoint21, boompoint2,boompoint3,boompoint31,2)) complete
|
|
' Wait For(rectanglechecker(boompoint31, boompoint3,boompoint4,boompoint41,3)) complete
|
|
' Wait For(rectanglechecker(boompoint41, boompoint4,boompoint5,boompoint51,4)) complete
|
|
|
|
Wait For (lineintersect(boompoint00,boompoint0,boompoint01,boompoint10,boompoint1,boompoint11,0)) complete
|
|
|
|
Wait For (lineintersect(boompoint10,boompoint1,boompoint11,boompoint20,boompoint2,boompoint21,1)) complete
|
|
Wait For (lineintersect(boompoint20,boompoint2,boompoint21,boompoint30,boompoint3,boompoint31,2)) complete
|
|
Wait For (lineintersect(boompoint30,boompoint3,boompoint31,boompoint40,boompoint4,boompoint41,3)) complete
|
|
Wait For (lineintersect(boompoint40,boompoint4,boompoint41,boompoint50,boompoint5,boompoint51,4)) complete
|
|
timerx=DateTime.Now-timerx
|
|
Log("timerx"&timerx)
|
|
bmcGraph.DrawLine(boompoint01.x,boompoint01.y,boompoint51.x,boompoint51.y,xui.Color_red,1)
|
|
bmcGraph.DrawLine(boompoint01.x,boompoint01.y,boompoint0.x,boompoint0.y,xui.Color_magenta,1)
|
|
'bmcGraph.DrawLine(boompoint0.x,boompoint0.y,boompoint5.x,boompoint5.y,xui.Color_red,1)'shows up too much on trail
|
|
bmcGraph.DrawLine(boompoint51.x,boompoint51.y,boompoint5.x,boompoint5.y,xui.Color_blue,1)
|
|
|
|
'(boompoint0, boompoint00, boompoint50, boompoint5))
|
|
'(boompoint0.x,boompoint0.y, boompoint00.x,boompoint00.y, boompoint50.x,boompoint50.y, boompoint5.x,boompoint5.y))
|
|
End If
|
|
|
|
|
|
boompoint00.x=boompoint0.x'custom type issue, equating one boompoint to another just refers rather than copying over, this is in reference to primitive and nonprimitive variables
|
|
boompoint00.y=boompoint0.y
|
|
boompoint10.x=boompoint1.x
|
|
boompoint10.y=boompoint1.y
|
|
boompoint20.x=boompoint2.x
|
|
boompoint20.y=boompoint2.y
|
|
boompoint30.x=boompoint3.x
|
|
boompoint30.y=boompoint3.y
|
|
boompoint40.x=boompoint4.x
|
|
boompoint40.y=boompoint4.y
|
|
|
|
boompoint50.x=boompoint5.x
|
|
boompoint50.y=boompoint5.y
|
|
|
|
|
|
'rectanglefiller(boompoint0.x)', boompoint00, boompoint50, boompoint5)
|
|
'/////// Jacks transform bitmapcreator
|
|
'Sleep(2000)
|
|
Dim r As B4XRect
|
|
r.Initialize(xposnew-400,yposnew-400,xposnew+400,yposnew+400)'defines the square that is observed and copied from bc
|
|
bmc2ndgraph.Initialize(imvGraph.Width, imvGraph.Height)
|
|
Dim dt As DrawTask = bmcGraph.CreateDrawTask(bmcGraph,r,imvGraph.Width/2,imvGraph.Height/2,True)
|
|
dt.SrcScaleX=4
|
|
dt.SrcScaleY=4
|
|
dt.Degrees=-Starter.Location2.Bearing
|
|
'Log("bearing"&Starter.Location2.Bearing)
|
|
''Log("bmc"&bmcGraph.mHeight)
|
|
''Log("imvgraph.width"&imvGraph.Width)
|
|
bmc2ndgraph.DrawBitmapCreatorTransformed(dt)
|
|
cvsGraph.DrawBitmap(bmc2ndgraph.Bitmap,b4arect1)
|
|
imvGraph.Invalidate
|
|
section1colour.Color=boomcolor(0)
|
|
section2colour.Color=boomcolor(1)
|
|
section3colour.Color=boomcolor(2)
|
|
section4colour.Color=boomcolor(3)
|
|
section5colour.Color=boomcolor(4)
|
|
'///
|
|
|
|
'Dim r As B4XRect
|
|
'r.Initialize(450,450, 550,550)'xposnew+bmcGraph.mWidth/20,yposnew+bmcGraph.mHeight/20)
|
|
'Dim dt As DrawTask = bmcGraph.CreateDrawTask(bmcGraph, r, 100, 100, True) '(50, 50) defines the target center
|
|
'dt.SrcScaleX = .5
|
|
'dt.SrcScaleY = .5
|
|
'Log(bmcGraph.mWidth)
|
|
'dt.Degrees = -heading
|
|
' dt.TargetX=200
|
|
' dt.TargetY=200
|
|
' dt.SkipBlending=True
|
|
' dt.Source=bmcGraph
|
|
' dt.SrcRect=r
|
|
' bmcGraph.DrawCircle(100,100,30,Colors.Black,True,1)
|
|
' bmcGraph.DrawLine(3,3,100,100,xui.Color_red,3)
|
|
'bmcGraph.DrawBitmapCreatorTransformed(dt)
|
|
' imvGraph.SetBitmap(bmcGraph.Bitmap)
|
|
' bmc2ndgraph.Initialize(pnlGraph.Width, pnlGraph.Height)
|
|
'need to clear bmc2ndgraph above before writing a clean image onto it. Otherwise DrawBitmapCreatorTransformed(dt) just draws over the top
|
|
' bmc2ndgraph.DrawBitmapCreatorTransformed(dt)
|
|
' canv.DrawBitmap(bc.Bitmap,Null,b4arect)
|
|
'imvGraph.SetBitmap(bmcGraph.Bitmap)
|
|
' cvsGraph.DrawBitmap(bmcGraph.Bitmap,rectanglewholeb4x)
|
|
' imvGraph.Invalidate
|
|
'imvGraph.Bitmap=(bmc2ndgraph.Bitmap)
|
|
', xposright, yposright, width
|
|
''Log("color"&bmcGraph.GetColor(100,100))
|
|
|
|
'r.Initialize(0, 0, bmcGraph.mWidth, bmcGraph.mHeight)
|
|
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
|
'ABOVE WORKS, BELOW DOSEN'T. i THINK IT IS BEACUSE RECTANGLE CAN'T HAVE NEGATIVE COORDS
|
|
'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
|
'FIXED BY ENLARGING MAIN BC AND STARTING IN MIDDLE. cRASHES WHEN AN ATTEMPT IS MADE TO DRAW OUTSIDE THIS BC.
|
|
'NEED TO CHECK THAT HEADING IS CORRECT.
|
|
'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZXXXXXXXXXXXXXXXXXXCCCCCCCCCCCCCCCCCCVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
|
|
|
|
|
|
|
|
|
|
xpos = xposnew
|
|
ypos = yposnew
|
|
End Sub
|
|
|
|
Sub BtnFast_Click
|
|
velocity = velocity + 1
|
|
|
|
End Sub
|
|
|
|
Sub BtnStop_Click
|
|
velocity = 0
|
|
|
|
End Sub
|
|
|
|
Sub BtnSlow_Click
|
|
velocity = velocity - 1
|
|
End Sub
|
|
|
|
Sub BtnLeft_Click
|
|
|
|
headingrate = headingrate -1
|
|
|
|
End Sub
|
|
|
|
Sub BtnRight_Click
|
|
headingrate = headingrate +1
|
|
|
|
End Sub
|
|
|
|
Sub BtnClear_Click
|
|
'timeriterate.Enabled = False
|
|
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
|
bmcGraph.Initialize(pnlGraph.Width*10, pnlGraph.Height*10)
|
|
imvGraph.Bitmap=(bmcGraph.Bitmap)
|
|
'timeriterate.Enabled = True
|
|
End Sub
|
|
|
|
'Sub BtnActivateTimerTick_Click
|
|
'timeriterate.Enabled = True
|
|
'IterateTimer_Tick
|
|
'End Sub
|
|
|
|
Sub BtnDraw_Click
|
|
Dim intcolour As Int
|
|
For i=0 To pnlGraph.Width-1
|
|
For j=0 To pnlGraph.Height-1
|
|
intcolour = bmcGraph.GetColor(i,j)
|
|
'don't know why white is showing up as =0 in this test. Testing for color white doesn't work
|
|
If bmcGraph.GetColor(i,j) <> 0 Then 'fx.Colors.To32Bit(fx.Colors.White) and xui.Color_White don't work
|
|
'bmcGraph.SetColor(i,j,fx.Colors.To32Bit(fx.Colors.Green))
|
|
End If
|
|
|
|
Next
|
|
Next
|
|
bmcGraph.DrawLine(0,0,pnlGraph.Width, 0,xui.Color_Magenta,100)
|
|
Dim r As B4XRect
|
|
'r.Initialize(0, 0, bmcGraph.mWidth, bmcGraph.mHeight)
|
|
r.Initialize(bmcGraph.mWidth/4, bmcGraph.mHeight/4, bmcGraph.mWidth*0.75, bmcGraph.mHeight*0.75)
|
|
Dim dt As DrawTask = bmcGraph.CreateDrawTask(bmcGraph, r, pnlGraph.Width/2, pnlGraph.Height/2, True) '(50, 50) defines the target center
|
|
dt.SrcScaleX = 1
|
|
dt.SrcScaleY = 1
|
|
dt.Degrees = 15
|
|
' bmcGraph.DrawBitmapCreatorTransformed(dt)
|
|
' imvGraph.SetBitmap(bmcGraph.Bitmap)
|
|
bmc2ndgraph.DrawBitmapCreatorTransformed(dt)
|
|
|
|
imvGraph.Bitmap=(bmc2ndgraph.Bitmap)
|
|
'the inclusion of the following line results in unexpected behaviour
|
|
'bmcGraph = bmc2ndgraph
|
|
End Sub
|
|
|
|
'points must be in order
|
|
Sub rectanglechecker(point1 As coordX, point2 As coordX, point3 As coordX, point4 As coordX, k As Int)As ResumableSub
|
|
Dim RC_ACWmap As Map
|
|
Dim RC_CWmap As Map
|
|
Dim RC_line1xvalues As List
|
|
Dim RC_line2xvalues As List
|
|
Dim RC_line2yvalues As List
|
|
Dim RC_line1yvalues As List
|
|
'Dim boomcolor As Int
|
|
|
|
RC_ACWmap.Initialize 'used to progress clockwise and anticlockwise around rectangle
|
|
RC_ACWmap.Put(point1,point2)
|
|
RC_ACWmap.Put(point2,point3)
|
|
RC_ACWmap.Put(point4,point1)
|
|
RC_ACWmap.Put(point3,point4)
|
|
|
|
RC_CWmap.Initialize
|
|
RC_CWmap.Put(point1,point4)
|
|
RC_CWmap.Put(point2,point1)
|
|
RC_CWmap.Put(point4,point3)
|
|
RC_CWmap.Put(point3,point2)
|
|
|
|
RC_line1xvalues.Initialize
|
|
RC_line2xvalues.Initialize
|
|
RC_line1yvalues.initialize
|
|
RC_line2yvalues.Initialize
|
|
|
|
|
|
Dim pmax As coordX
|
|
Dim pmin As coordX
|
|
Dim temp As coordX
|
|
Dim Pmap As Map 'lets us grab the maxY and minY after finding the min and max value
|
|
Pmap.Initialize
|
|
Pmap.Put(point1.y,point1)
|
|
Pmap.Put(point2.y,point2)
|
|
Pmap.Put(point4.y,point4)
|
|
Pmap.Put(point3.y,point3)
|
|
|
|
pmax.Initialize
|
|
pmin.Initialize
|
|
|
|
Dim temp3 As Float
|
|
temp3 = Max(point1.y,Max(point2.y,Max(point4.y,point3.y)))
|
|
Dim temp4 As Float
|
|
temp4 = Min(point1.y,Min(point2.y,Min(point4.y,point3.y)))
|
|
pmax=Pmap.Get(temp3) 'temp variable required, otherwise pmax is null
|
|
pmin=Pmap.Get(temp4)
|
|
Dim temp2 As coordX
|
|
temp = pmax
|
|
RC_line1xvalues.add(pmax.x)'initial point to both line lists
|
|
RC_line1yvalues.add(pmax.y)
|
|
RC_line2xvalues.add(pmax.x)
|
|
RC_line2yvalues.add(pmax.y)
|
|
|
|
Do While temp <> pmin 'cwloop
|
|
temp2=RC_CWmap.Get(temp)'gets second point for line
|
|
Wait For(calcline(temp.x,temp.y, temp2.x,temp2.y,RC_line1xvalues,RC_line1yvalues)) complete 'RC_line2xvalues generated
|
|
temp = RC_CWmap.Get(temp) 'changes the first line point to the second
|
|
Loop
|
|
temp = pmax
|
|
|
|
|
|
|
|
Do While temp <> pmin 'acwloop
|
|
temp2=RC_ACWmap.Get(temp)'gets second point for line
|
|
wait for (calcline(temp.x,temp.y, temp2.x,temp2.y,RC_line2xvalues,RC_line2yvalues)) complete 'RC_line2xvalues generated
|
|
temp = RC_ACWmap.Get(temp) 'changes the first line point to the second
|
|
Loop
|
|
RC_line1xvalues.add(pmin.x)'adds final point to both line lists
|
|
RC_line1yvalues.add(pmin.y)
|
|
RC_line2xvalues.add(pmin.x)
|
|
RC_line2yvalues.add(pmin.y)
|
|
Dim ytemp As Int
|
|
Dim pixelchecked As Int
|
|
pixelchecked=0
|
|
'Dim loop1cycles As Int
|
|
' loop1cycles=0
|
|
' Dim loop2onetake2 As Double
|
|
' loop2onetake2=0
|
|
' bmcGraph.DrawLine(line1xvalues.Get(i),ytemp,line2xvalues.get(i),ytemp,boomcolour,1)
|
|
' ytemp=ytemp-1
|
|
|
|
ytemp=pmax.y 'could choose to save both x and y values to RC_line1xvalues rather than just x.
|
|
For i=0 To (Min(RC_line1xvalues.Size,RC_line2xvalues.Size)-1) 'iterates from top point to bottom of polygone, drawing a level line from left to right
|
|
For j=RC_line2xvalues.Get(i) To RC_line1xvalues.Get(i) Step 1'issue solved, was counting from a higher number to a lower number rather than lower to higher
|
|
'Log("j="&j)
|
|
pixelchecked=pixelchecked+1
|
|
' loop2onetake2=loop2onetake2+RC_line1xvalues.Get(i)-RC_line2xvalues.Get(i)
|
|
' Log("1 "&RC_line1xvalues.Get(i))
|
|
' Log("2 "&RC_line2xvalues.Get(i))
|
|
' Log("ytemp"&ytemp)
|
|
' Log("color"&bmcGraph.GetColor(j,ytemp))
|
|
'bmcGraph.DrawCircle(RC_line1xvalues.Get(i),ytemp,6,-16711936,False,2)'-7829368 is gray
|
|
If bmcGraph.GetColor(j,ytemp)=-1 Then
|
|
boomon=True
|
|
boomcolor(k)=xui.Color_Green
|
|
Log("pixelchecked"&pixelchecked)
|
|
' Log("loop2"&loop2onetake2)
|
|
' Log("boomon"&boomon)
|
|
Return boomcolor(k)
|
|
|
|
End If
|
|
' bmcGraph.setColor(j,ytemp,xui.Color_Yellow)
|
|
Next
|
|
' loop1cycles=loop1cycles+1
|
|
'bmcGraph.DrawLine(RC_line1xvalues.Get(i),ytemp,RC_line2xvalues.get(i),ytemp,xui.Color_green,1)
|
|
ytemp=ytemp-1
|
|
Next
|
|
Log("pixelchecked"&pixelchecked)
|
|
boomcolor(k)=xui.Color_yellow
|
|
'Log("line1size"&RC_line1xvalues.size)
|
|
' Log("line2size"&RC_line2xvalues.size)
|
|
' Log("loop1cycles"&loop1cycles)
|
|
' Log("loop2 "&loop2onetake2)
|
|
boomon=False
|
|
Log("boomon"&boomon)
|
|
' Log("pauselinefalse")
|
|
Return boomcolor(k)
|
|
End Sub
|
|
|
|
'Return true to allow the default exceptions handler to handle the uncaught exception.
|
|
Sub Application_Error (Error As Exception, StackTrace As String) As Boolean
|
|
Return True
|
|
End Sub
|
|
|
|
|
|
Private Sub Initialize(Index As Int)
|
|
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
|
|
bmcGraph.Initialize(1000,1000)
|
|
'the following line
|
|
'bmc2ndgraph.Initialize(pnlGraph.Width/2, pnlGraph.Height/2)
|
|
' results in the following commands enlarging the bmc2ndgraph to fit
|
|
'bmc2ndgraph.DrawBitmapCreatorTransformed(dt)
|
|
'imvGraph.SetBitmap(bmc2ndgraph.Bitmap)
|
|
|
|
bmc2ndgraph.Initialize(mapsize.x, mapsize.y)
|
|
rectanglewhole.Initialize(0,0,mapsize.x,mapsize.y)
|
|
rectanglewholeb4x.Initialize(0,0,1000,1000)
|
|
bmcGraph.DrawRect(rectanglewholeb4x,xui.Color_white,True,1)
|
|
bmcGraph.DrawLine(5,900,900,5,xui.Color_green,60)
|
|
bmcGraph.DrawLine(5,300,300,5,xui.Color_green,40)
|
|
'cvsGraph.DrawBitmap(bmcGraph.bitmap,rectanglewholeb4x)
|
|
'imvGraph.Invalidate
|
|
|
|
End Sub
|
|
'points must be in order
|
|
Sub rectanglefiller(point1 As coordX, point2 As coordX, point3 As coordX, point4 As coordX,k As Int)As ResumableSub
|
|
'find pmax, find pmin
|
|
'construct line clockwise from pmax to pmin
|
|
'construct line anticlockwise from pmax to pmin
|
|
'pull list of x values and draw canvas line between all
|
|
Dim timer As Long
|
|
timer=DateTime.Now
|
|
' point1.x=boompoint00.x
|
|
' point1.y=boompoint00.y
|
|
' point2.x=boompoint0.x
|
|
' point2.y=boompoint0.y
|
|
' point4.x=boompoint50.x
|
|
' point4.y=boompoint50.y
|
|
' point3.x=boompoint5.x
|
|
' point3.y=boompoint5.y
|
|
Dim line1xvalues As List
|
|
Dim line2xvalues As List
|
|
Dim line1yvalues As List
|
|
Dim line2yvalues As List
|
|
Dim CWmap As Map
|
|
Dim ACWmap As Map
|
|
|
|
ACWmap.Initialize 'used to progress clockwise and anticlockwise around rectangle
|
|
ACWmap.Put(point1,point2)
|
|
ACWmap.Put(point2,point3)
|
|
ACWmap.Put(point4,point1)
|
|
ACWmap.Put(point3,point4)
|
|
|
|
CWmap.Initialize
|
|
CWmap.Put(point1,point4)
|
|
CWmap.Put(point2,point1)
|
|
CWmap.Put(point4,point3)
|
|
CWmap.Put(point3,point2)
|
|
line1xvalues.Initialize
|
|
line2xvalues.Initialize
|
|
line1yvalues.initialize
|
|
line2yvalues.Initialize
|
|
|
|
|
|
Dim pmax As coordX
|
|
Dim pmin As coordX
|
|
Dim temp As coordX
|
|
Dim Pmap As Map 'lets us grab the maxY and minY after finding the min and max value
|
|
Pmap.Initialize
|
|
Pmap.Put(point1.y,point1)
|
|
Pmap.Put(point2.y,point2)
|
|
Pmap.Put(point4.y,point4)
|
|
Pmap.Put(point3.y,point3)
|
|
|
|
'//
|
|
'line1:y1=g1x1+h2
|
|
'line2:y2=g2x2+h2
|
|
'Dim g0 As Float
|
|
'Dim g1 As Float
|
|
'Dim h0 As Float
|
|
'Dim h1 As Float
|
|
'Dim Inter As floatcoord
|
|
'If point1.x = point4.x Then 'line is verticle, ie;x=2
|
|
' 'find line2(x=2) which is intercect point
|
|
'End If
|
|
'If point2.x = point3.x Then 'line2 is verticle'
|
|
' 'find line2(x=2) which is intercect point
|
|
'End If
|
|
'g0=(point1.y-point4.y)/(point1.x-point4.x)
|
|
'g1=(point2.y-point3.y)/(point2.x-point3.x)
|
|
'h0=point1.y-point1.x*(point1.y-point4.y)/(point1.x-point4.x)
|
|
'h1=point2.y-point2.x*(point2.y-point3.y)/(point2.x-point3.x)
|
|
'Inter.x=(h1-h0)/(g1-g0)
|
|
'Inter.y=g0*Inter.x+h0
|
|
|
|
'// vector form
|
|
'//
|
|
|
|
|
|
'pmax=Max(point1.y,Max(point2.y,Max(point4.y,point3.y)))
|
|
'pmin=Min(point1.y,Min(point2.y,Min(point4.y,point3.y)))
|
|
pmax.Initialize
|
|
pmin.Initialize
|
|
' Log(Max(point1.y,Max(point2.y,Max(point4.y,point3.y))))
|
|
Dim temp3 As Float
|
|
temp3 = Max(point1.y,Max(point2.y,Max(point4.y,point3.y)))
|
|
Dim temp4 As Float
|
|
temp4 = Min(point1.y,Min(point2.y,Min(point4.y,point3.y)))
|
|
' Log(Pmap.Get(temp3))
|
|
pmax=Pmap.Get(temp3) 'temp variable required, otherwise pmax is null
|
|
pmin=Pmap.Get(temp4)
|
|
Dim temp2 As coordX
|
|
temp = pmax
|
|
line1xvalues.add(pmax.x)'initial point to both line lists
|
|
line1yvalues.add(pmax.y)
|
|
line2xvalues.add(pmax.x)
|
|
line2yvalues.add(pmax.y)
|
|
|
|
Do While temp <> pmin 'cwloop
|
|
temp2=CWmap.Get(temp)'gets second point for line
|
|
Wait For(calcline(temp.x,temp.y, temp2.x,temp2.y,line1xvalues,line1yvalues)) complete 'line2xvalues generated
|
|
temp = CWmap.Get(temp) 'changes the first line point to the second
|
|
'Log("line1")
|
|
Loop
|
|
temp = pmax
|
|
|
|
|
|
|
|
Do While temp <> pmin 'acwloop
|
|
temp2=ACWmap.Get(temp)'gets second point for line
|
|
wait for (calcline(temp.x,temp.y, temp2.x,temp2.y,line2xvalues,line2yvalues)) complete 'line2xvalues generated
|
|
temp = ACWmap.Get(temp) 'changes the first line point to the second
|
|
'Log("line2")
|
|
Loop
|
|
line1xvalues.add(pmin.x)'final point to both line lists
|
|
line1yvalues.add(pmin.y)
|
|
line2xvalues.add(pmin.x)
|
|
line2yvalues.add(pmin.y)
|
|
Dim ytemp As Int
|
|
'bitmap1.InitializeMutable(40dip,40dip)
|
|
'canvas1.Initialize2(bitmap1)
|
|
ytemp=pmax.y 'could choose to save both x and y values to line1xvalues rather than just x.
|
|
For i=0 To Min(line1xvalues.Size,line2xvalues.Size)-1
|
|
bmcGraph.DrawLine(line1xvalues.Get(i),ytemp,line2xvalues.get(i),ytemp,boomcolor(k),1)
|
|
ytemp=ytemp-1
|
|
' Log(line1xvalues.size)
|
|
' Log(xposnew)
|
|
' Log(yposnew)
|
|
' Log(heading)
|
|
' Log(point1)
|
|
' Log(point2)
|
|
' Log(point4)
|
|
' Log(point3)
|
|
|
|
' bitmap2.Initializemutable(1000dip,1000dip)
|
|
' bitmap2=bitmap1.Resize(1000,1000,False)
|
|
'Label1.SetBackgroundImage(bitmap1)
|
|
' ImageView1.Color=(Colors.White)
|
|
' ImageView1.Bitmap = bitmap2
|
|
Next
|
|
|
|
|
|
'End If
|
|
' timer=DateTime.Now-timer
|
|
' Log("timer")
|
|
' Log(timer)
|
|
' bitmap2.Initializemutable(1000dip,1000dip)
|
|
' bitmap2=bitmap1.Resize(1000,1000,False)
|
|
'Label1.SetBackgroundImage(bitmap1)
|
|
' ImageView1.Color=(Colors.White)
|
|
' ImageView1.Bitmap = bitmap2
|
|
' Log($"line1size ${line1yvalues.size}"$)
|
|
' Log($"line2size ${line2yvalues.size}"$)
|
|
Return 2
|
|
End Sub
|
|
|
|
Sub calcline (tx1 As Int,ty1 As Int,tx2 As Int, ty2 As Int, linenumber As List, lineynumber As List) As ResumableSub
|
|
'initialy a duplicate of bresenham
|
|
Dim x As Int = tx1
|
|
Dim y As Int = ty1
|
|
|
|
Dim dx As Int = Abs(tx2 - tx1)
|
|
Dim dy As Int = Abs(ty2 - ty1)
|
|
|
|
Dim signx As Int = (tx2-tx1)/dx
|
|
Dim signy As Int = (ty2-ty1)/dy
|
|
|
|
Dim changed As Boolean = False
|
|
|
|
|
|
If (dy>=dx) Then
|
|
Dim dy As Int = Abs(tx2 - tx1) 'swap
|
|
Dim dx As Int = Abs(ty2 - ty1)
|
|
changed = True
|
|
|
|
' Log(changed)
|
|
Else
|
|
' Log(changed)
|
|
|
|
|
|
End If
|
|
|
|
|
|
|
|
Dim e As Float = (2*dy)-dx
|
|
For i=1 To dx
|
|
'canvas1.DrawPoint((x),(y),Colors.Black)
|
|
If lineynumber.Get(lineynumber.size-1)<>y Then
|
|
linenumber.add(x)
|
|
lineynumber.add(y)
|
|
End If
|
|
Do While e>=0
|
|
If changed=True Then
|
|
' If signx<0 Then
|
|
x=x+signx
|
|
'Else
|
|
' x=x+1
|
|
'End If
|
|
Else
|
|
' If signy<0 Then
|
|
y=y+signy
|
|
' Else
|
|
' y=y+1
|
|
' End If
|
|
End If
|
|
e=e-2*dx
|
|
Loop
|
|
If changed=True Then
|
|
y =y+signy
|
|
Else
|
|
x =x+signx
|
|
End If
|
|
e=e+(2*dy)
|
|
|
|
Next
|
|
' canvas1.DrawPoint(x2,y2,Colors.Black)
|
|
' linenumber.Add(tx2)
|
|
' lineynumber.add(ty2)
|
|
Return Null
|
|
|
|
End Sub
|
|
|
|
Sub location_center 'to convert lat and long into 0.5m bitmap location
|
|
'get current location
|
|
|
|
Private distance As Float
|
|
Private radius As Float
|
|
Private H1 As Float 'long
|
|
Private O1 As Float 'lat
|
|
Private H2 As Float 'long
|
|
Private O2 As Float 'lat
|
|
Dim location6 As Location
|
|
|
|
location6.Initialize
|
|
' location6.Latitude=(-32.6661)
|
|
' location6.Longitude=(118.1861)
|
|
Dim location7 As Location
|
|
location7.Initialize
|
|
' location7.Latitude=(-32.666)
|
|
' location7.Longitude=(118.1861)
|
|
origin.Initialize
|
|
radius =6372300
|
|
origin.lat =Starter.location2.Latitude
|
|
' Log("lat"&Starter.location2.Latitude)
|
|
origin.lng =Starter.location2.Longitude
|
|
' Log("long"&Starter.location2.Longitude)
|
|
H1=(origin.lng)/360*2*cPI
|
|
H2=(origin.lng+.01)/360*2*cPI
|
|
'Log(origin.lat)
|
|
O1=(origin.lat)/360*2*cPI
|
|
O2=(origin.lat+.01)/360*2*cPI
|
|
'Dim disttohouse As Float
|
|
location6.Latitude=O1
|
|
location6.Longitude=H1
|
|
location7.Latitude=O1
|
|
location7.Longitude=H2
|
|
deltalat=-2*radius*ASin(Power(Power(Sin((O2-O1)/2),2)+Cos(O1)*Cos(O2)*Power(Sin((0)/2),2),.5))/.01*2'111000
|
|
deltalong=2*radius*ASin(Power(Cos(O1)*Cos(O1)*Power(Sin((H2-H1)/2),2),.5))/.01*2'fudge'94000
|
|
|
|
'therefore 1 change in longitude equals deltalong in m
|
|
'and 1 change in latitude equals deltalat in m
|
|
'Log("det "&deltalat)
|
|
' Log("del "&deltalong)
|
|
' Log("location6 "&(location6.DistanceTo(location7)/.01))
|
|
' Log("house"&disttohouse)
|
|
' deltalat=-2*radius*ASin(Power(Power(Sin((O2-O1)/2),2)+Cos(O1)*Cos(O2)*Power(Sin((H1-H1)/2),2),.5))'111000
|
|
|
|
End Sub
|
|
|
|
Sub Activity_Resume
|
|
If Starter.GPS1.GPSEnabled = False Then
|
|
ToastMessageShow("Please enable the GPS device.", True)
|
|
StartActivity(Starter.GPS1.LocationSettingsIntent) 'Will open the relevant settings screen.
|
|
Else
|
|
Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_ACCESS_FINE_LOCATION)
|
|
Wait For Activity_PermissionResult (Permission As String, Result As Boolean)
|
|
If Result Then CallSubDelayed(Starter, "StartGPS")
|
|
End If
|
|
End Sub
|
|
|
|
Sub Activity_Pause (UserClosed As Boolean)
|
|
CallSubDelayed(Starter, "StopGPS")
|
|
End Sub
|
|
|
|
Sub lineintersect (point1p As coordX, point1c As coordX,point1f As coordX, point2p As coordX, point2c As coordX,point2f As coordX,k As Int) As ResumableSub
|
|
'pointp=past: pointc=current: pointf=future
|
|
'filler(boompoint0, boompoint00, boompoint10, boompoint1,0))
|
|
'//
|
|
'line1:y1=g1x1+h2
|
|
'line2:y2=g2x2+h2
|
|
|
|
Dim U As Float
|
|
Dim V As Float
|
|
Dim denominat As Float
|
|
Dim intersectpoint As coordX
|
|
intersectpoint.Initialize
|
|
|
|
|
|
denominat=(point2c.x-point1c.x)*(point2f.y-point1f.y)-(point2c.y-point1c.y)*(point2f.x-point1f.x)
|
|
If denominat=0 Then
|
|
'lines are parrallel, do rectangle find
|
|
rectanglefiller(point1c,point1p,point2p,point2c,k)
|
|
rectanglechecker(point1f,point1c,point2c,point2f,k)
|
|
Return
|
|
End If
|
|
|
|
U=((point1c.y-point1f.y)*(point2f.x-point1f.x)-(point2f.y-point1f.y)*(point1c.x-point1f.x))/denominat
|
|
v=((point1c.y-point1f.y)*(point2c.x-point1c.x)-(point2c.y-point1c.y)*(point1c.x-point1f.x))/denominat
|
|
If (U>0 And U<1 And v<1 And v>0) Then
|
|
'lines intersect, therefore need to calculate areas inside two triangles rather than one rectangle
|
|
intersectpoint.x=point1c.x+(point2c.x-point1c.x)*U
|
|
intersectpoint.y=point1c.y+(point2c.y-point1c.x)*V
|
|
trianglefiller(point1c,point1p,intersectpoint,k)
|
|
trianglefiller(point2c,point2p,intersectpoint,k)
|
|
'!!need the case to be that if either of the following checkers return a "gap" then section needs to be on
|
|
boomcolor(k)=Colors.yellow
|
|
wait for (trianglechecker(point1f,point1p,intersectpoint,k)) complete
|
|
If boomcolor(k)=Colors.Yellow Then
|
|
wait for (trianglechecker(point2f,point2p,intersectpoint,k)) complete
|
|
End If
|
|
Return
|
|
Else
|
|
'lines are not parrellel, but dont intersect
|
|
wait for (rectanglefiller(point1c,point1p,point2p,point2c,k)) complete
|
|
wait for (rectanglechecker(point1f,point1c,point2c,point2f,k)) complete
|
|
Return
|
|
End If
|
|
End Sub
|
|
|
|
Sub trianglefiller(point1 As coordX, point2 As coordX, point3 As coordX,k As Int)As ResumableSub
|
|
'find pmax, find pmin
|
|
'construct line clockwise from pmax to pmin
|
|
'construct line anticlockwise from pmax to pmin
|
|
'pull list of x values and draw canvas line between all
|
|
Dim timer As Long
|
|
timer=DateTime.Now
|
|
|
|
Dim line1xvalues As List
|
|
Dim line2xvalues As List
|
|
Dim line1yvalues As List
|
|
Dim line2yvalues As List
|
|
Dim CWmap As Map
|
|
Dim ACWmap As Map
|
|
|
|
ACWmap.Initialize 'used to progress clockwise and anticlockwise around rectangle
|
|
ACWmap.Put(point1,point2)
|
|
ACWmap.Put(point2,point3)
|
|
ACWmap.Put(point3,point1)
|
|
|
|
|
|
CWmap.Initialize
|
|
CWmap.Put(point1,point3)
|
|
CWmap.Put(point2,point1)
|
|
CWmap.Put(point3,point2)
|
|
line1xvalues.Initialize
|
|
line2xvalues.Initialize
|
|
line1yvalues.initialize
|
|
line2yvalues.Initialize
|
|
|
|
|
|
Dim pmax As coordX
|
|
Dim pmin As coordX
|
|
Dim temp As coordX
|
|
Dim Pmap As Map 'lets us grab the maxY and minY after finding the min and max value
|
|
Pmap.Initialize
|
|
Pmap.Put(point1.y,point1)
|
|
Pmap.Put(point2.y,point2)
|
|
Pmap.Put(point3.y,point3)
|
|
|
|
pmax.Initialize
|
|
pmin.Initialize
|
|
Dim temp3 As Float
|
|
temp3 = Max(point1.y,Max(point2.y,point3.y))
|
|
Dim temp4 As Float
|
|
temp4 = Min(point1.y,Min(point2.y,point3.y))
|
|
pmax=Pmap.Get(temp3) 'temp variable required, otherwise pmax is null
|
|
pmin=Pmap.Get(temp4)
|
|
Dim temp2 As coordX
|
|
temp = pmax
|
|
line1xvalues.add(pmax.x)'initial point to both line lists
|
|
line1yvalues.add(pmax.y)
|
|
line2xvalues.add(pmax.x)
|
|
line2yvalues.add(pmax.y)
|
|
|
|
Do While temp <> pmin 'cwloop
|
|
temp2=CWmap.Get(temp)'gets second point for line
|
|
Wait For(calcline(temp.x,temp.y, temp2.x,temp2.y,line1xvalues,line1yvalues)) complete 'line2xvalues generated
|
|
temp = CWmap.Get(temp) 'changes the first line point to the second
|
|
'Log("line1")
|
|
Loop
|
|
temp = pmax
|
|
|
|
|
|
|
|
Do While temp <> pmin 'acwloop
|
|
temp2=ACWmap.Get(temp)'gets second point for line
|
|
wait for (calcline(temp.x,temp.y, temp2.x,temp2.y,line2xvalues,line2yvalues)) complete 'line2xvalues generated
|
|
temp = ACWmap.Get(temp) 'changes the first line point to the second
|
|
'Log("line2")
|
|
Loop
|
|
line1xvalues.add(pmin.x)'final point to both line lists
|
|
line1yvalues.add(pmin.y)
|
|
line2xvalues.add(pmin.x)
|
|
line2yvalues.add(pmin.y)
|
|
Dim ytemp As Int
|
|
ytemp=pmax.y 'could choose to save both x and y values to line1xvalues rather than just x.
|
|
For i=0 To Min(line1xvalues.Size,line2xvalues.Size)-1
|
|
bmcGraph.DrawLine(line1xvalues.Get(i),ytemp,line2xvalues.get(i),ytemp,boomcolor(k),1)
|
|
ytemp=ytemp-1
|
|
|
|
Next
|
|
|
|
Return 2
|
|
End Sub
|
|
|
|
|
|
Sub trianglechecker(point1 As coordX, point2 As coordX, point3 As coordX, k As Int)As ResumableSub
|
|
Dim ACWmap As Map
|
|
Dim CWmap As Map
|
|
Dim line1xvalues As List
|
|
Dim line2xvalues As List
|
|
Dim line2yvalues As List
|
|
Dim line1yvalues As List
|
|
|
|
|
|
ACWmap.Initialize 'used to progress clockwise and anticlockwise around rectangle
|
|
ACWmap.Put(point1,point2)
|
|
ACWmap.Put(point2,point3)
|
|
ACWmap.Put(point3,point1)
|
|
|
|
|
|
CWmap.Initialize
|
|
CWmap.Put(point1,point3)
|
|
CWmap.Put(point2,point1)
|
|
CWmap.Put(point3,point2)
|
|
|
|
line1xvalues.Initialize
|
|
line2xvalues.Initialize
|
|
line1yvalues.initialize
|
|
line2yvalues.Initialize
|
|
|
|
|
|
Dim pmax As coordX
|
|
Dim pmin As coordX
|
|
Dim temp As coordX
|
|
Dim Pmap As Map 'lets us grab the maxY and minY after finding the min and max value
|
|
Pmap.Initialize
|
|
Pmap.Put(point1.y,point1)
|
|
Pmap.Put(point2.y,point2)
|
|
Pmap.Put(point3.y,point3)
|
|
|
|
pmax.Initialize
|
|
pmin.Initialize
|
|
|
|
Dim temp3 As Float
|
|
temp3 = Max(point1.y,Max(point2.y,point3.y))
|
|
Dim temp4 As Float
|
|
temp4 = Min(point1.y,Min(point2.y,point3.y))
|
|
pmax=Pmap.Get(temp3) 'temp variable required, otherwise pmax is null
|
|
pmin=Pmap.Get(temp4)
|
|
Dim temp2 As coordX
|
|
temp = pmax
|
|
line1xvalues.add(pmax.x)'initial point to both line lists
|
|
line1yvalues.add(pmax.y)
|
|
line2xvalues.add(pmax.x)
|
|
line2yvalues.add(pmax.y)
|
|
|
|
Do While temp <> pmin 'cwloop
|
|
temp2=CWmap.Get(temp)'gets second point for line
|
|
Wait For(calcline(temp.x,temp.y, temp2.x,temp2.y,line1xvalues,line1yvalues)) complete 'line2xvalues generated
|
|
temp = CWmap.Get(temp) 'changes the first line point to the second
|
|
Loop
|
|
temp = pmax
|
|
|
|
|
|
|
|
Do While temp <> pmin 'acwloop
|
|
temp2=ACWmap.Get(temp)'gets second point for line
|
|
wait for (calcline(temp.x,temp.y, temp2.x,temp2.y,line2xvalues,line2yvalues)) complete 'line2xvalues generated
|
|
temp = ACWmap.Get(temp) 'changes the first line point to the second
|
|
Loop
|
|
line1xvalues.add(pmin.x)'adds final point to both line lists
|
|
line1yvalues.add(pmin.y)
|
|
line2xvalues.add(pmin.x)
|
|
line2yvalues.add(pmin.y)
|
|
Dim ytemp As Int
|
|
Dim pixelchecked As Int
|
|
pixelchecked=0
|
|
|
|
|
|
ytemp=pmax.y 'could choose to save both x and y values to line1xvalues rather than just x.
|
|
For i=0 To (Min(line1xvalues.Size,line2xvalues.Size)-1) 'iterates from top point to bottom of polygone, drawing a level line from left to right
|
|
For j=line2xvalues.Get(i) To line1xvalues.Get(i) Step 1'issue solved, was counting from a higher number to a lower number rather than lower to higher
|
|
pixelchecked=pixelchecked+1
|
|
If bmcGraph.GetColor(j,ytemp)=-1 Then
|
|
boomon=True
|
|
boomcolor(k)=xui.Color_Green
|
|
Return boomcolor(k)
|
|
|
|
End If
|
|
Next
|
|
ytemp=ytemp-1
|
|
Next
|
|
boomcolor(k)=xui.Color_yellow
|
|
boomon=False
|
|
Log("boomon"&boomon)
|
|
Return boomcolor(k)
|
|
End Sub |