问一个java编程问题:定义一个矩形类(Rectangle)

定义一个矩形类(Rectangle)用来表示矩形,要求:
提供可以改变矩形坐标位置的方法;
提供可以改变矩形宽高的方法;
提供求矩形面积的方法;
提供计算一个点是否在矩形内的方法.

public class Rectangle {
// top, left 左上角那个顶点的坐标
// width: 宽
// heigth: 长
private double top, left, width, height;

// 构造函数
public Rectangle(double top, double left, double width, double height) {
this.top = top;
this.left = left;
this.width = width;
this.height = height;
}

// 改变顶点坐标,即改变矩形坐标位置
public void location(double top, double left) {
this.top = top;
this.left = left;
}

// 改变宽,高,即改变矩形宽高
public void size(double width, double height) {
this.width = width;
this.height = height;
}

// 计算面积,宽×高
public double area() {
return width * height;
}

// 判断某点是否在矩形内
public boolean isInside(double x, double y) {
// 这里采用的是数学上的坐标系,即向上向右为正
// 如果采用向下向右为正的话,则要改
// return x > this.left && x < this.left + this.width && y < this.top +
// this.height && y > this.top;
// 这里点不包括在边上,如果在边上也算的话,把小于号或大于号改成小于等于及大于等于
return x > this.left && x < this.left + this.width
&& y > this.top - this.height && y < this.top;
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-09-11
说明 有两个类Rectangle 和Point
=======
package rectangle;

public class Rectangle {

//确定一个矩形 至少需要3个点,假设一个矩形按逆时针的方向点为A、B、C、D取A、B、C3点
Point pointA;
Point pointB;
Point pointC;

public Point getPointA() {
return pointA;
}

public void setPointA(Point pointA) {
this.pointA = pointA;
}

public Point getPointB() {
return pointB;
}

public void setPointB(Point pointB) {
this.pointB = pointB;
}

public Point getPointC() {
return pointC;
}

public void setPointC(Point pointC) {
this.pointC = pointC;
}

/*
* 要求1: 提供可以改变矩形坐标位置的方法; 即移动一个矩形 矩形3点都会变化
* 要求2: 提供可以改变矩形宽高的方法; 移动矩形3点中的一点
* 要求3: 提供求矩形面积的方法; 求点距 并做乘法
* 要求4: 提供计算一个点是否在矩形内的方法. 如果矩形的的长宽为平行或垂直于XY 轴将极大的方便这一过程
*
* 思路若矩形的长宽为平行或垂直于X Y轴 非常有利于此问题的解决
* 先解决此种特殊情况
* 在考虑 X Y轴沿坐标原点选择对3点的坐标的实践表换过程
*/

//移动矩形
public void moveRectangle(int mx,int my){
//沿X轴正向移动为正数,反之负数
//沿Y轴正向移动为正数,反之负数
this.pointA.move(mx, my);
this.pointB.move(mx, my);
this.pointC.move(mx, my);
}

public void changeWidth(double distance){
//逆时针旋转坐标到x轴与B C两点的连线平行 并返回新坐标
Point pointAA=Point.turnTheCenterPoint(pointA, pointB, pointC);
Point pointBB=Point.turnTheCenterPoint(pointC, pointB, pointC);
Point pointCC=Point.turnTheCenterPoint(pointC, pointB, pointC);
//此时在新坐标系下 AB边与X轴锤子 BC边与X轴平行
//假定AB边为需要改变的宽 移动的点为A点 网上为增加整数 往下为减 负数
pointAA.setY(pointAA.getY()+distance);
//改变的只有A点 只需要将A点变回原坐标系下的点 也就是顺时针再转回坐标系
//鉴于你一分都不给 我就不写了 自己弄去吧
//反转坐标系 获取A的新坐标
}

//求面积
public double getMianJi(int mx,int my){
return Point.getDistance(pointA, pointB)*Point.getDistance(pointB, pointC);
}

//判断矩形框中是不是有某个点 假定矩形有一边平行于X轴
public boolean hasPoint(Point p){
//逆时针旋转坐标到x轴与B C两点的连线平行 并返回新坐标
Point pointAA=Point.turnTheCenterPoint(pointA, pointB, pointC);
Point pointCC=Point.turnTheCenterPoint(pointC, pointB, pointC);
Point pp=Point.turnTheCenterPoint(p, pointB, pointC);
if(pointAA.getX()<=pp.getX()&&pointCC.getX()>=pp.getX()&&pointAA.getY()>=pp.getY()&&pointCC.getY()<=pp.getY()){
return true;
}else{
return false;
}
}

}

===============
package rectangle;
public class Point {

private double x;
private double y;

public double getX() {
return x;
}
public void setX(double x) {
this.x = x;
}
public double getY() {
return y;
}
public void setY(double y) {
this.y = y;
}
public void move(double mx,double my){
x+=mx;
y+=my;
}
//求两点点距
public static double getDistance(Point a,Point b){
return Math.sqrt(Math.pow(a.getX()-b.getX(), 2)+Math.pow(a.getY()-b.getY(), 2));
}

/*
*逆时针转动坐标原点,转到X轴于矩形的BC平行
*需要转动的角度A tan$=(pointB.y-pointC.y)/(pointA.x-pointC.x)
*
*转动后所有点和X轴的夹角都减小了$度
*返回转到后的新点(新坐标)
*/
public static Point turnTheCenterPoint(Point pointA,Point pointB,Point pointC){
double a=Math.atan(pointA.getY()/pointA.getX());
double b=Math.atan((pointB.getY()-pointC.getY())/(pointA.getX()-pointC.getX()));
double xx=Math.sin(a-b);
double newPointX=xx*Math.sqrt((Math.pow(pointA.getX(), 2)+Math.pow(pointA.getY(), 2)));
double yy=Math.cos(a-b);
double newPointY=yy*Math.sqrt((Math.pow(pointA.getX(), 2)+Math.pow(pointA.getY(), 2)));
Point point=new Point();
point.setX(newPointX);
point.setY(newPointY);
return point;
}
}
第2个回答  2008-09-11
package s;

public class Rectangle {

/**
* @param args
*/
private int lx;//左上横坐标

private int ly;//左上纵坐标

private int rx;//右上下横坐标

private int ry;//右下纵坐标

public int getLx() {
return lx;
}

public void setLx(int lx) {
this.lx = lx;
}

public int getLy() {
return ly;
}

public void setLy(int ly) {
this.ly = ly;
}

public int getRx() {
return rx;
}

public void setRx(int rx) {
this.rx = rx;
}

public int getRy() {
return ry;
}

public void setRy(int ry) {
this.ry = ry;
}

public void setLeft(int x,int y){
this.setLx(x);
this.setLy(y);
}

public void setRight(int x,int y){
this.setRx(x);
this.setRy(y);
}

//判断长和宽
public boolean isBool(){
return Math.abs(this.getRx()-this.getLx())>=Math.abs(this.getRy()-this.getLy());
}

}

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网