에러님, 여수다님,수다님 정말 감사합니다.~~
민트맛캔디
몇일전에 질문 게시판에 볼록 다각형에 대해서 질문 드렸던 학생입니다.
근데 지금에서야 뒤늦게 인사드리는거지만
이렇게 많은 분이 성의있게 대답해 주실줄은 정말 기대 안 했는데 정말 감동받았습니다.
ㅜ,,ㅡ
사실 이게 알고리즘만 구하라는 과제였는데,
제가 좀 오바해서 결국, 알고리즘을 만들어내고, 구현을 까지해서 교수님께 제출을 하였습니다.
이 과목은 다름아닌 컴퓨터 그래픽스 이구여 ^^;
이걸 구현까지 해서 제출한 도라이는 저 밖에 없었습니당 ㅡ,,ㅡ;답변주신 내용으로 구현을 못해서 죄송합니다 ㅜㅜ;
이게 볼록다각형의 간단한 성질을 이용해서 구현을 한다는게 말은 쉬운데 구현부분이 상당히 어려움이 있는데,
그래서 어떤 일정한 규칙을 찾아내서 구현을 해야한다는 결정을 내렸습니다.
그래서 어떤 분명한 규칙을 찾아냈고, 구현까지 하였구여.
근데, 알고리즘은 분명히 맞는데 도저히 안 되는 부분이 있어서 이 부분은 교수님께 좀 봐달라구
부탁을 드렸는데 아직 답변이 없으십니다~ ㅎㅎ
답변 감사드리구, 구현한거 첨부합니당 ^^
소스도 올라갑니당.
알고리즘은 분명히 자신하는데 판별이 지대로 못하구 있네여 ^,^;
분명 자료가 캐스팅 될 때 문제가 된거라 생각되는데
암튼~ 보시면 X축 Y축 두 축을 주사하는데 볼록다각형은 선과 만나는 점이 항상 두개 이하고,
볼록다각형은 두개 이상이 나오는 지점이 한군데 이상 있다는 점에서 아이디어를 얻어서 구현을 하였답니다. ^^
import java.awt.*;
import javax.swing.*;
public class ConvexPolygon extends JFrame
{
int point; // 다각형의 점의 개수
int pointPlaceX[], pointPlaceY[]; // 좌표점의 데이터
double c[]; // 각 직선 방정식의 상수값
double gradient[]; // 각 직선 방정식의 기울기
static LookAndFeel alloyLnF;
static ConvexPolygon application;
int count=0;
boolean value[];
String result = 결과 : 볼록다각형입니다, tempString;
Boolean valueBoolean = false;
double X_MAX, X_MIN, Y_MAX, Y_MIN= 0.0;
// 멤버변수 선언 끝
public ConvexPolygon()
{
super(볼록 다각형 판별 프로그램);
//JFrame.setDefaultLookAndFeelDecorated(true);
//JDialog.setDefaultLookAndFeelDecorated(true);
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
while( point = 0 ) // 사용자로부터 양의 정수값을 입력받기 위한 부분
{
try{
point = Integer.parseInt(JOptionPane.showInputDialog(this, 몇 개의 점을 입력하시겠습니까,입력,JOptionPane.INFORMATION_MESSAGE));
while( point =0)
point = Integer.parseInt(JOptionPane.showInputDialog(this, 양의 정수 값를 입력해 주세요!,오류,JOptionPane.INFORMATION_MESSAGE));
}
catch(Exception e)
{ // 실수의 범위나 스트링, 공백 입력하였을 경우의 예외처리가 된다.
JOptionPane.showMessageDialog(this, 문자열 또는 실수를 입력하였습니다!,오류,JOptionPane.INFORMATION_MESSAGE);
}
} // while()문hile()문 닫음
// 좌표점에 관한 배열이 메모리에 할당되는건 사용자의 입력을 받은 이후
pointPlaceX = new int[point+1]; pointPlaceY = new int[point+1]; // 마지막 점은 첫번째 점의 정보 입력
c = new double [point];
gradient = new double[point];
JOptionPane.showMessageDialog(this, 다각형 점의 좌표를 반시계 방향으로 입력해 주세요,입력,JOptionPane.INFORMATION_MESSAGE);
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
for(int i=0; ipoint; i++) // 좌표점 입력받기
{ // 좌표점은 음수일 수도 있다
while( valueBoolean == false)
{
try // 좌표점은 음수일 수도 있다
{ count = 0;
pointPlaceX[i] = (Integer.parseInt(JOptionPane.showInputDialog((i+1)+ 번째점의 X 좌표값을 입력해주세요.)));
if(count == 0) // 예외가 발생하지 않으면 다음 좌표값으로 넘어간다
valueBoolean = true; count =0;
}
catch(Exception e)
{
count++;
JOptionPane.showMessageDialog(this, (i+1)+ 번째점의 X 좌표값을 다시 입력해주세요.,오류,JOptionPane.INFORMATION_MESSAGE);
}
} valueBoolean = false;
while( valueBoolean == false)
{
try
{ count = 0;
pointPlaceY[i] = (Integer.parseInt(JOptionPane.showInputDialog((i+1)+ 번째점의 Y 좌표값을 입력해주세요.)));
if(count == 0)
valueBoolean = true; count =0; // 예외가 발생하지 않으면 다음 좌표값
}
catch(Exception e)
{
count++;
JOptionPane.showMessageDialog(this, (i+1)+ 번째점의 Y 좌표값을 다시 입력해주세요.,오류,JOptionPane.INFORMATION_MESSAGE);
}
}
valueBoolean = false;
} // 이 부분에서 사용할만한 지원 메소드를 찾지못해 결과적 조금 복잡하게 구현
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
pointPlaceX[point] = pointPlaceX[0]; // 마지막 점은 시작점의 좌료를 넣어서 다각형을 닫아준다.
pointPlaceY[point] = pointPlaceY[0]; // 각 점들을 잇는 선분 직선방정식의 기울기 값과 상수값
for(int i=0; ipoint; i++)
{
gradient[i] = ((double)(pointPlaceY[i] - pointPlaceY[i+1]) / (double)(pointPlaceX[i] - pointPlaceX[i+1])); // 기울기
// 기울기 = Y값의 변화량 / X값의 변화량
c[i] = (double)pointPlaceY[i] - gradient[i]*(double)pointPlaceX[i];
// 상수값 C = Y-MX
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
for(int i=0; ipoint;i++) // 다각형 X축, Y축 각각의 최소값과 최소값
{
if( X_MAX pointPlaceX[i])
X_MAX = pointPlaceX[i];
if( X_MIN pointPlaceX[i])
X_MIN = pointPlaceX[i];
if( Y_MAX pointPlaceY[i])
Y_MAX = pointPlaceY[i];
if( Y_MIN pointPlaceY[i])
Y_MIN = pointPlaceY[i];
}
X_MIN += 0.5;
Y_MIN += 0.5;
int count_valuey =0;
int count_valuex =0;
Boolean valuex = true;
Boolean valuey = true;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 입력된 다각형이 볼록 다각형인지 실제 판별되는 부분
/* 문제 추측 부분 */
while( X_MINX_MAX) // X축 주사
{
for(int i=0; ipoint; i++)
{
if( (((X_MIN-c[i])/gradient[i]) Y_MIN) && (((X_MIN-c[i])/gradient[i]) Y_MAX))
{
count_valuex++;
if( count_valuex 2)
valuex = false;
}
count_valuex=0;
}
X_MIN += 0.5;
}
while( Y_MINY_MAX) // Y축 주사
{
for(int i=0; ipoint; i++)
{
if( Y_MIN-c[i]/gradient[i] X_MIN && Y_MIN-c[i]/gradient[i] X_MAX )
{
count_valuey++;
if( count_valuey 2)
valuey = false;
}
count_valuey=0;
}
Y_MIN += 0.5;
}
System.out.println(valuex + +valuey);
if( valuex == false || valuey == false)
result = 볼록다각형이 아닙니다;
} // 생성자 메소드 닫힘
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public void paint( Graphics g )
{
super.paint(g);
g.setColor(Color.white);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 입력받은 점을 라인을 이어 실제 보이는 다각형을 그려준다.
g.drawLine( 0,150,400,150 ); // X축 Y축 표현
g.drawLine( 200,5,200,295 );
g.setColor(Color.black);
for(int i=0; ipoint; i++)
{
g.fillOval(pointPlaceX[i]*15+198, -pointPlaceY[i]*15+148, 4,4); // 좌표점 찍어주기
g.drawLine(pointPlaceX[i]*15+200,-pointPlaceY[i]*15+150,pointPlaceX[i+1]*15+200, -pointPlaceY[i+1]*15+150);
}
g.drawString(result, 10, 280);
// 자바는 좌표점의 시작이 상단좌측부터 이라, -Y 대칭변환
// 100 과 15 값은 의물だ?의미상 확대의 기능
}
public static void main(String args[])
{
ConvexPolygon application = new ConvexPolygon();
// 실행위해 볼록다각형 클래스 객체 생성
application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
application.setSize(400,300);
application.show();
application.setResizable(false);}
}
번호 | 제 목 | 글쓴이 | 날짜 |
---|---|---|---|
2701230 | 테마 설정하면 밑에 뜨는 글 삭제 (1) | 창의적 | 2025-07-12 |
2701177 | css적용이 안되요~ (6) | 다니엘 | 2025-07-11 |
2701151 | 사이트작업시 inputbox 가 readonly 형태표시 어떻게 하시나요? (1) | 찬내 | 2025-07-11 |
2701123 | 간단한 select 질문입니다 (3) | 천사의눈물 | 2025-07-11 |
2701061 | 비베질문.. | 똘끼 | 2025-07-10 |
2701034 | 메일폼 내 script 삽입가능한 방법 없을까요.. (2) | 마음새 | 2025-07-10 |
2701008 | 분명히 버튼을 만들었는데 액션이 안걸립니다. (3) | 재찬 | 2025-07-10 |
2700923 | 전체중앙정렬&독타입&쿼크모드 ㅜㅠ (8) | 푸른들 | 2025-07-09 |
2700893 | 질문드리겠습니다. | 도도한 | 2025-07-09 |
2700793 | 무비클립에 마우스 오버시 랜덤으로 효과음 나기는 어떻게 ;; (1) | 바닐라 | 2025-07-08 |
2700741 | 웹전송? (2) | 연와인 | 2025-07-07 |
2700686 | 카테고리 호버시 세부카테고리 보이게하는 것, css로만 가능할까요?? (3) | 다힘 | 2025-07-07 |
2700658 | 메타태그 질문드립니다..ㅠㅠ;;; | 모해 | 2025-07-07 |
2700632 | 외부에서 이미지 파일을 불러와야 합니다. 도와주세요. (4) | 에일린 | 2025-07-06 |
2700579 | (air + as3) smtp 이용해서 첨부파일 포함해서 메일 보내기 | 물보라 | 2025-07-06 |
2700524 | 클릭시 밑에 메뉴 나오게 (4) | 새솔 | 2025-07-05 |
2700505 | activex를 비쥬얼6.0으로 만들었는데요 비스타 배포시에 안되서 질문드립니다 (3) | 참이 | 2025-07-05 |
2700452 | c언어에서... 자료형 구분.... (3) | 시내 | 2025-07-05 |
2700422 | 버전에 관해 질문 | 라온제나 | 2025-07-04 |
2700393 | mysql이 갑자기!!!!!!!!!!!!!!!에러가;; (2) | 소미 | 2025-07-04 |