You are not logged in.

Dear visitor, welcome to Jabaco - Community. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

theuserbl

Intermediate

  • "theuserbl" started this thread

Posts: 436

Date of registration: Dec 20th 2008

  • Send private message

1

Tuesday, August 18th 2009, 5:23pm

VBCircle

The current Circle-Implementation of Jabaco is like the version of Java.

If you prefer the Circle of QBasic and Visual Basic, I have modified the current implementation a bit for it.

Write in your local Framework in the PictureBox.jsrc file the following

Jabaco Source

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Public Sub VBCircle(x As Single, y As Single, radius As Single, color As Long, startAngle As Single, endAngle As Single, aspect As Single, FillColor As Long)
  If endAngle <=0 Or endAngle > 2*Pi Then endAngle=2*Pi
  Dim halfStep1 As Single, halfStep2 As Single ' Is needed. If I don't do it, it don't run ok. Don't know why.
  Dim my2DGraphics As Graphics2D
  my2DGraphics = getGraphics()
  Dim tmpColor As Color
  tmpColor = my2DGraphics.getColor
  Dim angleLen As Single
  If endAngle > startAngle Then
    angleLen = endAngle-startAngle
  Else
    angleLen = endAngle+2*Pi-startAngle
  End If

  ' As I sayd before, if I don't do it, the program runs not perfect:
  halfStep1 = startAngle/Pi*180
  halfStep2 = angleLen/Pi*180

  Call my2DGraphics.setColor(RGBToColor(FillColor))
  If FillColor <> -1 Then
    If aspect > 1 Then
      Call my2DGraphics.fillArc(x-radius/aspect, y-radius, radius*2/aspect, radius*2, halfStep1, halfStep2)
    Else
      Call my2DGraphics.fillArc(x-radius, y-radius*aspect, radius*2, radius*2*aspect, halfStep1, halfStep2)
    End If
  End If  

  If color=-1 Then color=ForeColor
  Call my2DGraphics.setColor(RGBToColor(color))
  If aspect > 1 Then
    Call my2DGraphics.drawArc(x-radius/aspect, y-radius, radius*2/aspect, radius*2, halfStep1, halfStep2)
  Else
    Call my2DGraphics.drawArc(x-radius, y-radius*aspect, radius*2, radius*2*aspect, halfStep1, halfStep2)
  End If
 
  Call my2DGraphics.setColor(tmpColor)
  Call disposeGraphics(my2DGraphics)
End Sub


then you have a VB6-compatible Circle called VBCircle.

Don't know why, but the halfStep1 and halfStep2 are needed.
For example: If you write in line 33

Jabaco Source

1
Call my2DGraphics.drawArc(x-radius, y-radius*aspect, radius*2, radius*2*aspect, startAngle/Pi*180, angleLen/Pi*180)

then it don't draw all correct. It must go the way over the halfsteps.

If you want to test it, here a little Jabaco-example, which makes use of VBCircle

Jabaco Source

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Public Sub Command1_Click()
   Picture1.VBCircle(40, 40, 36, 1, 3, 2, 2, RGB(255,255,0))
   Picture1.VBCircle(0,0,30,12,1,3,2, -1)
   Picture1.VBCircle(150,100,100,RGB(255,0,0),0,1/2*3.141,1, -1)
   Picture1.VBCircle(150,100,100,12,0,0,2, -1)
   Picture1.VBCircle(150,100,100,12,0,0,4, -1)
   Picture1.VBCircle(150,100,100,12,0,0,8, -1)
   Picture1.VBCircle(150,100,100,12,0,0,1/2, -1)
   Picture1.VBCircle(150,100,100,12,0,0,1/4, -1)
   Picture1.VBCircle(150,100,100,12,0,0,1/8, -1)

   
   'Creating a "Gleichdick". (Its a german word, Don't know how it is called in english)
   'Ein Gleichdick ist - egal wo man es misst - an allen Stellen gleich dick. Obwohl es kein Kreis ist.

   XPos = 300
   YPos = 70
   Breite = 300

   Hoehe = sqr((Breite*Breite)-((Breite/2) * (Breite/2)))

   Picture1.ForeColor=RGB(180,180,180)

   Picture1.Line(XPos,YPos,XPos+Breite,YPos)
   Picture1.Line(XPos,YPos,XPos+Breite/2,YPos+Hoehe)
   Picture1.Line(XPos+Breite/2,YPos+Hoehe,XPos+Breite,YPos)

   Picture1.ForeColor=RGB(255,0,0)
   Picture1.VBCircle (XPos, YPos, Breite, -1, 300 / 180 * Pi, 360 / 180 * Pi, 1, -1)
   Picture1.VBCircle (XPos + Breite / 2, YPos + Hoehe, Breite, -1, 60 / 180 * Pi, 120 / 180 * Pi, 1, -1)
   Picture1.VBCircle (XPos + Breite, YPos, Breite, -1, 180 / 180 * Pi, 240 / 180 * Pi, 1, -1)
End Sub


I have now found in Wikipedia, that a "Gleichdick" is called in english "Curve of constant width":
http://en.wikipedia.org/wiki/Curve_of_constant_width

And on that curve you can also see, which happend, if you do not use the halfSteps in the VBCircle-implementation.

To compre the demo-program with similar VB6 code, here is it:
The demo-program in VB6:

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Sub Command1_Click()
   Picture1.Circle (40 * 15, 40 * 15), 36 * 15, 1, 3, 2, 2
   Picture1.Circle (0 * 15, 0 * 15), 30 * 15, 12, 1, 3, 2
   Picture1.Circle (150 * 15, 100 * 15), 100 * 15, RGB(255, 0, 0), 0, 1 / 2 * 3.141, 1
   Picture1.Circle (150 * 15, 100 * 15), 100 * 15, 12, 0, 0, 2
   Picture1.Circle (150 * 15, 100 * 15), 100 * 15, 12, 0, 0, 4
   Picture1.Circle (150 * 15, 100 * 15), 100 * 15, 12, 0, 0, 8
   Picture1.Circle (150 * 15, 100 * 15), 100 * 15, 12, 0, 0, 1 / 2
   Picture1.Circle (150 * 15, 100 * 15), 100 * 15, 12, 0, 0, 1 / 4
   Picture1.Circle (150 * 15, 100 * 15), 100 * 15, 12, 0, 0, 1 / 8

   
   'Creating a "Gleichdick". (Its a german word, Don't know how it is called in english)
   'Ein Gleichdick ist - egal wo man es misst - an allen Stellen gleich dick. Obwohl es kein Kreis ist.
   Pi = 3.141593

   XPos = 300 * 15
   YPos = 70 * 15
   Breite = 300 * 15

   Hoehe = Sqr((Breite * Breite) - ((Breite / 2) * (Breite / 2)))

   Picture1.ForeColor = RGB(180, 180, 180)

   Picture1.Line (XPos, YPos)-(XPos + Breite, YPos)
   Picture1.Line (XPos, YPos)-(XPos + Breite / 2, YPos + Hoehe)
   Picture1.Line (XPos + Breite / 2, YPos + Hoehe)-(XPos + Breite, YPos)

   Picture1.ForeColor = RGB(255, 0, 0)
   Picture1.Circle (XPos, YPos), Breite, , 300 / 180 * Pi, 360 / 180 * Pi, 1
   Picture1.Circle (XPos + Breite / 2, YPos + Hoehe), Breite, , 60 / 180 * Pi, 120 / 180 * Pi, 1
   Picture1.Circle (XPos + Breite, YPos), Breite, , 180 / 180 * Pi, 240 / 180 * Pi, 1
End Sub


And the demo-program in QBasic

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
SCREEN 12
LINE (0, 0)-(639, 479), 15, BF

CIRCLE (40, 40), 36, 1, 3, 2, 2
CIRCLE (0, 0), 30, 12, 1, 3, 2
CIRCLE (150, 100), 100, 12, 0, 1 / 2 * 3.141, 1
CIRCLE (150, 100), 100, 0, , , 2
CIRCLE (150, 100), 100, 0, , , 4
CIRCLE (150, 100), 100, 0, , , 8
CIRCLE (150, 100), 100, 0, , , 1 / 2
CIRCLE (150, 100), 100, 0, , , 1 / 4
CIRCLE (150, 100), 100, 0, , , 1 / 8

   
'Creating a "Gleichdick". (Its a german word, Don't know how it is called in english)
'Ein Gleichdick ist - egal wo man es misst - an allen Stellen gleich dick. Obwohl es kein Kreis ist.
Pi = 3.141593

XPos = 300
YPos = 70
Breite = 300

Hoehe = SQR((Breite * Breite) - ((Breite / 2) * (Breite / 2)))

LINE (XPos, YPos)-(XPos + Breite, YPos), 7
LINE (XPos, YPos)-(XPos + Breite / 2, YPos + Hoehe), 7
LINE (XPos + Breite / 2, YPos + Hoehe)-(XPos + Breite, YPos), 7

CIRCLE (XPos, YPos), Breite, 12, 300 / 180 * Pi, 0 / 180 * Pi, 1
CIRCLE (XPos + Breite / 2, YPos + Hoehe), Breite, 12, 60 / 180 * Pi, 120 / 180 * Pi, 1
CIRCLE (XPos + Breite, YPos), Breite, 12, 180 / 180 * Pi, 240 / 180 * Pi, 1


Edit:
Have before mentioned line 3 but cited line 33. Now corrected, that I have mentioned line 33.

This post has been edited 1 times, last edit by "theuserbl" (Aug 18th 2009, 5:56pm)


theuserbl

Intermediate

  • "theuserbl" started this thread

Posts: 436

Date of registration: Dec 20th 2008

  • Send private message

2

Wednesday, August 19th 2009, 6:38pm

Hmmm.. thinks that there existing still little problems with it.

Jabaco Source

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Dim angle As Double

Public Sub Form_Load()
      angle=0
   DrawReu(200,200,300,angle)
End Sub

Public Sub DrawReu (x As Single, y As Single, width As Single, rotation As Double)
   Picture1.VBCircle(x,y,3,0,0,0,1,-1)
   Hoehe = sqr((width*width)-((width/2) * (width/2)))
   'DHoehe = 2*tan(Pi/6)*width/2
   DHoehe = 2*Hoehe/3
   
   Picture1.ForeColor=0
   'Picture1.Line(x,y,x+cos(rotation)*DHoehe,y+sin(rotation)*DHoehe)
   'Picture1.Line(x,y,x+cos(rotation+2*Pi/3)*DHoehe,y+sin(rotation+2*Pi/3)*DHoehe)
   'Picture1.Line(x,y,x+cos(rotation+4*Pi/3)*DHoehe,y+sin(rotation+4*Pi/3)*DHoehe)
   
   Dim P11 As Single, P12 As Single
   Dim P21 As Single, P22 As Single
   Dim P31 As Single, P32 As Single
   
   P11 = 150 / 180 * Pi - rotation
   P12 = 210 / 180 * Pi - rotation
   
   P21 = 150 / 180 * Pi - rotation - 2 * Pi / 3
   P22 = 210 / 180 * Pi - rotation - 2 * Pi / 3
   
   P31 = 150 / 180 * Pi - rotation - 4 * Pi / 3 + 2 * Pi
   P32 = 210 / 180 * Pi - rotation - 4 * Pi / 3 + 2 * Pi
   
   If P11 < 0 Then P11 = P11 + 2 * Pi
   If P12 < 0 Then P12 = P12 + 2 * Pi
   
   If P21 < 0 Then P21 = P21 + 2 * Pi
   If P22 < 0 Then P22 = P22 + 2 * Pi
   
   If P31 < 0 Then P31 = P31 + 2 * Pi
   If P32 < 0 Then P32 = P32 + 2 * Pi
   
   Picture1.VBCircle(x+cos(rotation)*DHoehe,y+sin(rotation)*DHoehe,width,0,P11,P12,1,-1)
   Picture1.VBCircle(x+cos(rotation+2*Pi/3)*DHoehe,y+sin(rotation+2*Pi/3)*DHoehe,width,0,P21,P22,1,-1)
   Picture1.VBCircle(x+cos(rotation+4*Pi/3)*DHoehe,y+sin(rotation+4*Pi/3)*DHoehe,width,0,P31,P32,1,-1)

   
End Sub

Public Sub Command1_Click()
   Picture1.cls
   angle = angle + pi/16
   If angle>2*pi Then angle=angle-2*pi

   DrawReu(200,200,300,angle)
End Sub


On VB6 is runs ok, but on Jabaco there are the corners partly big open.
On VB6 on the other side, the corners are closed or only one pixel open.
Don't know why it runs on Jabaco so inexact.

And I am not sure, which part so inexact is:
Is it my VBCircle implementation or Jabaco or Suns Arc-implementation ?
I don't know.

Manuel

Administrator

  • "Manuel" is male

Posts: 256

Date of registration: Jul 16th 2008

Location: Erlangen, Germany

Occupation: Software Developer

Hobbies: Jabaco, game theory, text-mining

  • Send private message

3

Thursday, August 20th 2009, 8:26pm

Good job.

Quoted

Is it my VBCircle implementation or Jabaco or Suns Arc-implementation ?
It's not Jabaco :) That's the drawArc definition:

Java source code

1
public abstract void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle)


Try to use rounded values:

Jabaco Source

1
2
3
4
5
If aspect > 1 Then
   Call my2DGraphics.drawArc(Round(x - radius / aspect), Round(y - radius), Round(radius * 2.0 / aspect), Round(radius * 2.0), Round(halfStep1), Round(halfStep2))
Else
   Call my2DGraphics.drawArc(Round(x - radius), Round(y - radius * aspect), Round(radius * 2.0), Round(radius * 2.0 * aspect), Round(halfStep1), Round(halfStep2))
End If

Rate this thread
WoltLab Burning Board