Solved

Java - Max/Min of X & Y Points

Posted on 2010-09-09
9
316 Views
Last Modified: 2012-05-10
So I am having trouble figuring out why at this code can figure out the max/min of x with points but can only find the max of the y points.

I believe the code is somehow unreachable.. Here is the code:  
public Point[] extremes() {
		if (this.isEmpty())
			return null;

		// left, right , top, bottom
		Point left = null, right = null, top = null, bottom = null;
		Point returnArray[] = new Point[4];

		double xLeft = points[0].getX();
		double xRight = points[0].getX();
		double yUp = points[0].getY();
		double yDown = points[0].getY();
		
		for (int i = 1; i < size; i++) {
			if (points[i].getX() < xLeft) {
				xLeft = points[i].getX();
				left = points[i];
			} else if (points[i].getX() > xRight) {
				xRight = points[i].getX();
				right = points[i];
			}
		}
		
		
		for (int j = 1;j<size; j++) {
			
			if (points[j].getY() > yUp) {
				yUp = points[j].getY();
				top = points[j];
			} else if (points[j].getY() < yUp) {
				yDown = points[j].getY();
				bottom = points[j];
			}
		}
		
		
		returnArray[0] = left;
		returnArray[1] = right;
		returnArray[2] = top;
		returnArray[3] = bottom;
		
		
		
		
		
		return returnArray;
	}

Open in new window

0
Comment
Question by:kilroyitt
  • 5
  • 3
9 Comments
 
LVL 65

Expert Comment

by:rockiroads
Comment Utility
first glance is you never checked to see if it equalled yUp, you only check for greater than or less than

also, shouldn't your arrays start with 0?
0
 

Author Comment

by:kilroyitt
Comment Utility
Sorry I should have given more information about the problem, the array that is sent to this method is an array of points. Of those points I need to figure out which points are the highest/lowest on each axis. So the return array only needs to be 4 in length.

Comment to rocklroads: do you mean 0 for the for loops. I did that because wanted to initialize the points, so they could be compared.

*For this problem I do not need to worry about multiple points at the same height
0
 
LVL 35

Expert Comment

by:mccarl
Comment Utility
In lines 27 & 30 you comparing to yUp on both lines. Line 30 should be comparing against yDown.
0
 
LVL 35

Expert Comment

by:mccarl
Comment Utility
Also, why do it in two loops. You can just have the one loop and compare both X and Y in that loop!
0
How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

 

Author Comment

by:kilroyitt
Comment Utility
I had it one for loop initially but decided to split it in hopes of troubleshooting the problem:
*I have also corrected that problem in line 30, but I am still having trouble getting the bottom most to become something else than null.


To test here are the point I have been using
[(3.0,1.0), (2.0,2.0), (4.0,2.0), (3.0,3.0)]

And the output:
leftmost point in square: (2.0,2.0)
rightmost point in square: (4.0,2.0)
highest point in square: (3.0,3.0)
lowest point in square: null

Here is the current updated code:
public Point[] extremes() {
		if (this.isEmpty())
			return null;

		// left, right , top, bottom
		Point left = null, right = null, top = null, bottom = null;
		Point returnArray[] = new Point[4];

		double xLeft = points[0].getX();
		double xRight = points[0].getX();
		double yUp = points[0].getY();
		double yDown = points[0].getY();
		
		for (int i = 0; i < size; i++) {
			if (points[i].getX() < xLeft) {
				xLeft = points[i].getX();
				left = points[i];
			} else if (points[i].getX() > xRight) {
				xRight = points[i].getX();
				right = points[i];
			}else if (points[i].getY() > yUp) {
				yUp = points[i].getY();
				top = points[i];
			} else if (points[i].getY() < yDown) {
				yDown = points[i].getY();
				bottom = points[i];
			}
		}
		
		
		returnArray[0] = left;
		returnArray[1] = right;
		returnArray[2] = top;
		returnArray[3] = bottom;
		
		
		
		
		
		return returnArray;
	}

Open in new window

0
 
LVL 35

Expert Comment

by:mccarl
Comment Utility
On line 21, Don't make it an "else" condition. Make two totally separate if/else blocks, it's just that they can be in the one loop. And, you have them around the wrong way, for the yUp yDown comparison. If you think carefully about 3 scenarios, a y less than the current minimum, a y between the min and max and a y greater than the max, and follow it through the if/then/else that you had, you should see the issue.

It should be like below...

public Point[] extremes() {
		if (this.isEmpty())
			return null;

		// left, right , top, bottom
		Point left = null, right = null, top = null, bottom = null;
		Point returnArray[] = new Point[4];

		double xLeft = points[0].getX();
		double xRight = points[0].getX();
		double yUp = points[0].getY();
		double yDown = points[0].getY();
		
		for (int i = 0; i < size; i++) {
			if (points[i].getX() < xLeft) {
				xLeft = points[i].getX();
				left = points[i];
			} else if (points[i].getX() > xRight) {
				xRight = points[i].getX();
				right = points[i];
			}

                        if (points[i].getY() < yDown) {
				yDown = points[i].getY();
				bottom = points[i];
			} else if (points[i].getY() > yUp) {
				yUp = points[i].getY();
				top = points[i];
			}
		}
		
		
		returnArray[0] = left;
		returnArray[1] = right;
		returnArray[2] = top;
		returnArray[3] = bottom;
		
		
		
		
		
		return returnArray;
	}

Open in new window

0
 
LVL 35

Expert Comment

by:mccarl
Comment Utility
Sorry, forget that last part about the order of the comparison, I am obviously still waking up and my brain is not functioning 100% !!
0
 

Author Comment

by:kilroyitt
Comment Utility
Even with the split x & y if/else statements and swapped yup and ydown if elses the output remains the same. Do you know why the left point object is not be initialized?

0
 
LVL 35

Accepted Solution

by:
mccarl earned 125 total points
Comment Utility
Ah, I see what the issue is (and hopefully the last one). When you initialise the variable that hold the min/max values, you don't initialise the variables that hold the point that is the min/max. Because in your test data it is the first point that has the min Y, no other point is smaller than it so lines 24,25 in my last post (correctly) never get run. So you just have to change line 6 to ...
Point left = points[0], right = points[0], top = points[0], bottom = points[0];

Open in new window

0

Featured Post

What Security Threats Are You Missing?

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

Join & Write a Comment

For customizing the look of your lightweight component and making it look lucid like it was made of glass. Or: how to make your component more Apple-ish ;) This tip assumes your component to be of rectangular shape and completely opaque. (COD…
Basic understanding on "OO- Object Orientation" is needed for designing a logical solution to solve a problem. Basic OOAD is a prerequisite for a coder to ensure that they follow the basic design of OO. This would help developers to understand the b…
Viewers will learn about if statements in Java and their use The if statement: The condition required to create an if statement: Variations of if statements: An example using if statements:
Viewers will learn about basic arrays, how to declare them, and how to use them. Introduction and definition: Declare an array and cover the syntax of declaring them: Initialize every index in the created array: Example/Features of a basic arr…

772 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

15 Experts available now in Live!

Get 1:1 Help Now