Celebrate National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
Solved

# All points of drawArc or drawOval

Posted on 2007-04-02
Medium Priority
332 Views
When using drawArc or drawOval, is there a method that gives all points of that arc or oval?
0
Question by:CharleneS77
[X]
###### Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

• Help others & share knowledge
• Earn cash & points
• 3
• 3

LVL 10

Expert Comment

ID: 18838710
Hmm, no.

What do you want to achieve? Maybe there is a easy solution, but therefore we need to know what you want to achieve. :-)

Mark
0

Author Comment

ID: 18839321
I am in the process of creating  a meter.  The meter needle is determined by other variables.  When I draw my meter, I am trying to find a way to know where to draw my line (the needle), which will vary, but will always start at the center point of the circle or arc.
0

LVL 10

Expert Comment

ID: 18839417
You can calculate the point yourself, for example:

double perc = 0.25; //value between 0 and 1

int ox = (int) origin.getX();
int oy = (int) origin.getY();
int px = (int) Math.floor(Math.sin(perc * 2 * Math.PI) * radius);
int py = (int) Math.floor(Math.cos(perc * 2 * Math.PI) * radius);

g.drawLine(ox, oy, ox+px, oy+py);

This will draw a circle with a needle pointing to the east. If you change the 0.25 to 0.75 it will point to the West, it works counter-clockwise but it's no problem to change the rotation, maybe you even know how, but if you simply negate the perc variable it will work the other way around.

Mark
0

Author Comment

ID: 18840412
I have been testing what you have posted.  But I can't figure out how to only use the top half of the circle (my arc) and use the left most point of my arc as percentage 0.  I'll keep trying.

int xOrigin = 700;
int yOrigin = 500;

g.drawLine( 550, 500, 850, 500 );      // bottom of my meter

double percentage = 0.0;
int xPercentage = ( int ) Math.floor( Math.sin( percentage * 2 * Math.PI ) * radius );
int yPercentage = ( int ) Math.floor( Math.cos( percentage * 2 * Math.PI ) * radius );
g.drawLine( xOrigin, yOrigin, xOrigin + xPercentage, yOrigin + yPercentage );
0

Author Comment

ID: 18840951
I am trying to understand the basics of the code you posted.  I have broken down the statements that assign values to xPercentage and yPercentage so I can test them and understand how they are getting their values.  Why does the position of the line change for my last two tests?

double percentage = .25;      // 3 o'clock position
int xPercentage = ( int ) Math.floor( Math.sin( percentage * 2 * Math.PI ) * radius );
int yPercentage = ( int ) Math.floor( Math.cos( percentage * 2 * Math.PI ) * radius );
g.setColor( Color.WHITE );
g.drawLine( xOrigin, yOrigin, xOrigin + xPercentage, yOrigin + yPercentage );

percentage = .25;            // 3 o'clock position
xPercentage = ( int ) Math.floor( Math.sin( .25 * 2 * Math.PI ) * radius );
yPercentage = ( int ) Math.floor( Math.cos( .25 * 2 * Math.PI ) * radius );
g.setColor( Color.WHITE );
g.drawLine( xOrigin, yOrigin, xOrigin + xPercentage, yOrigin + yPercentage );

percentage = .25;            // 3 o'clock position
xPercentage = ( int ) Math.floor( Math.sin( 1.570796327 ) * radius );
yPercentage = ( int ) Math.floor( Math.cos( 1.570796327 ) * radius );
g.setColor( Color.WHITE );
g.drawLine( xOrigin, yOrigin, xOrigin + xPercentage, yOrigin + yPercentage );

//--------------------------------------------------------------------

// why are xPercentage and yPercentage different now?
percentage = .25;            // "almost" 6 o'clock position
xPercentage = ( int ) Math.floor( 4.111820039 );
yPercentage = ( int ) Math.floor( 149.9436325 );
g.setColor( Color.RED );
g.drawLine( xOrigin, yOrigin, xOrigin + xPercentage, yOrigin + yPercentage );

// why are xPercentage and yPercentage different now?
//percentage = .25;            // "almost" 6 o'clock position
//xPercentage = ( int ) Math.floor( Math.sin( percentage * 2 * Math.PI ) * radius );
//yPercentage = ( int ) Math.floor( Math.cos( percentage * 2 * Math.PI ) * radius );
g.setColor( Color.BLUE );
g.drawLine( xOrigin, yOrigin, xOrigin + 4, yOrigin + 149 );
0

LVL 10

Accepted Solution

ID: 18841734
Ok, let me explain. A full circle is 2*pi. So if I point at some value x then x+2*pi points at the same value. If you know how the sinus wave looks like you see it repeats itself precisely after 2*pi. The percentage variable decides where we want to point in the sinus wave. From this sin calculation we calculate our x position. The same goes for cosinus. Since sinus is 0 when x=0, and cosinus is 1 when x=0, you get two different results for sin and cos.

http://www.clarku.edu/~djoyce/trig/
or in particular:
http://www.clarku.edu/~djoyce/trig/angle.html

Now the code:
//Constants
int xOrigin = 200;
int yOrigin = 200;

//Draw meter

//Percentage is a value between 0 and 1. If zero, the needle will point to the
//left, if one it will point to the right. If it's 0.5 it will point upwards.
double percentage = i;
int xPercentage = ( int ) Math.round( Math.sin( (-percentage-0.5) * Math.PI ) * radius );
int yPercentage = ( int ) Math.round( Math.cos( (-percentage-0.5) * Math.PI ) * radius );
g.setColor( Color.RED );
g.drawLine( xOrigin, yOrigin, xOrigin + xPercentage, yOrigin + yPercentage );

Good luck,
Mark
0

## Featured Post

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Java had always been an easily readable and understandable language.  Some relatively recent changes in the language seem to be changing this pretty fast, and anyone that had not seen any Java code for the last 5 years will possibly have issues undeâ€¦
Go is an acronym of golang, is a programming language developed Google in 2007. Go is a new language that is mostly in the C family, with significant input from Pascal/Modula/Oberon family. Hence Go arisen as low-level language with fast compilationâ€¦
This theoretical tutorial explains exceptions, reasons for exceptions, different categories of exception and exception hierarchy.
This tutorial will introduce the viewer to VisualVM for the Java platform application. This video explains an example program and covers the Overview, Monitor, and Heap Dump tabs.
###### Suggested Courses
Course of the Month11 days, 16 hours left to enroll