import java.util.Arrays;
/**
* 아래 테스트 코드가 정상 동작하도록 클래스들을 완성하시오.
*
* getArea(): 사각형의 넓이를 반환한다.
* getCenterOfMass(): 사각형의 질량중심을 반환한다.
* GetAllPoints(): 사각형의 네 점을 배열로 반환한다.
* rot90(): Pivot을 기준으로 사각형을 90도 회전시킨다.
*/
class Vector2D {
public float x, y;
public Vector2D(float x, float y) {
this.x = x;
this.y = y;
}
public String toString() {
return this.x +","+this.y;
}
}
class RectCore {
protected Vector2D pos;
protected float w, h;
public RectCore(float x, float y, float w, float h) {
this.pos = new Vector2D(x, y);
this.w = w;
this.h = h;
}
public String toString() {
return "RECTCORE("+this.pos+","+w+","+h+")";
}
}
public class Rect extends RectCore {
String rotRec;
public Rect(float x, float y, float w, float h) {
super(x, y, w, h);
rotRec = "";
}
// 위에 객체가져오기위해서 super()해야했음
public float getArea() {
return this.w * this.h;
}
public Vector2D getCenterOfMass() {
return new Vector2D(pos.x + (w /2.0f), pos.y +(h /2.0f));
}
public Vector2D [] getAllPoints() {
return new Vector2D[]{ pos,
new Vector2D(pos.x,(pos.y+h)),
new Vector2D((pos.x+w),pos.y),
new Vector2D((pos.x+w),(pos.y+h))};
}
public void rot90(Vector2D pivot) {
Vector2D[] oldPoints = getAllPoints();
Vector2D[] newPoints = new Vector2D[4];
for (int i = 0; i < oldPoints.length; i++) {
newPoints[i] = new Vector2D(
-(oldPoints[i].y - pivot.y) + pivot.x,
(oldPoints[i].x - pivot.x) + pivot.y);
}
float min_x = newPoints[0].x;
float min_y = newPoints[0].y;
float max_x = newPoints[0].x;
float max_y = newPoints[0].y;
for (Vector2D twoD : newPoints) {
min_x = Math.min(min_x, twoD.x);
min_y = Math.min(min_y, twoD.y);
max_x = Math.max(max_x, twoD.x);
max_y = Math.max(max_y, twoD.y);
}
pos = new Vector2D(min_x, min_y);
w = max_x - min_x;
h = max_y - min_y;
}
@Override
public String toString () {
String s = super.toString();
s += "\n Area: "+getArea();
s += "\n CoM: "+getCenterOfMass();
s += "\n";
return s;
}
}
class RectTest {
public static void main(String[] args) {
Rect rect = new Rect(0.5f, 0.7f, 1.5f, 2.3f);
System.out.println("Area: " + rect.getArea());
System.out.println("CoM: " + rect.getCenterOfMass());
System.out.println("All Points: " + Arrays.toString(rect.getAllPoints()));
rect.rot90(new Vector2D(0.4f, 0.2f));
System.out.println("Rotated rect: " + rect);
// toString 메서드자체가 오버라이드 되면 객체명을 썼을 때 그 출력문을 출력하게 되어있데
}
}
수학적 개념이 어려웠던 예제인데 실무에 가면 수학적 개념을 통한 문제해결 많이 하게 될테니 나올때마다 익숙해져야한다
메서드에서 로컬변수 만들지 않고 return 값에 바로 출력될 수 있게 하는것 연습하자
해당 상황에서만 할 수 있는 해답이 아닌 하나의 원리를 발견해서 여러상황에서 사용할 수 있는 코드를 만들자
자바 키워드 암기 뿐 만아니라 이런 문제를 해결할 수 있는 능력을 키우는데 중점 두자