수다닷컴

  • 해외여행
    • 괌
    • 태국
    • 유럽
    • 일본
    • 필리핀
    • 미국
    • 중국
    • 기타여행
    • 싱가폴
  • 건강
    • 다이어트
    • 당뇨
    • 헬스
    • 건강음식
    • 건강기타
  • 컴퓨터
    • 프로그램 개발일반
    • C언어
    • 비주얼베이직
  • 결혼생활
    • 출산/육아
    • 결혼준비
    • 엄마이야기방
  • 일상생활
    • 면접
    • 취업
    • 진로선택
  • 교육
    • 교육일반
    • 아이교육
    • 토익
    • 해외연수
    • 영어
  • 취미생활
    • 음악
    • 자전거
    • 수영
    • 바이크
    • 축구
  • 기타
    • 강아지
    • 제주도여행
    • 국내여행
    • 기타일상
    • 애플
    • 휴대폰관련
  • 프로그램 개발일반
  • C언어
  • 비주얼베이직

에러님, 여수다님,수다님 정말 감사합니다.~~

민트맛캔디

2023.04.01

몇일전에 질문 게시판에 볼록 다각형에 대해서 질문 드렸던 학생입니다.

근데 지금에서야 뒤늦게 인사드리는거지만

이렇게 많은 분이 성의있게 대답해 주실줄은 정말 기대 안 했는데 정말 감동받았습니다.

ㅜ,,ㅡ
사실 이게 알고리즘만 구하라는 과제였는데,

제가 좀 오바해서 결국, 알고리즘을 만들어내고, 구현을 까지해서 교수님께 제출을 하였습니다.

이 과목은 다름아닌 컴퓨터 그래픽스 이구여 ^^;

이걸 구현까지 해서 제출한 도라이는 저 밖에 없었습니당 ㅡ,,ㅡ;답변주신 내용으로 구현을 못해서 죄송합니다 ㅜㅜ;

이게 볼록다각형의 간단한 성질을 이용해서 구현을 한다는게 말은 쉬운데 구현부분이 상당히 어려움이 있는데,

그래서 어떤 일정한 규칙을 찾아내서 구현을 해야한다는 결정을 내렸습니다.
그래서 어떤 분명한 규칙을 찾아냈고, 구현까지 하였구여.

근데, 알고리즘은 분명히 맞는데 도저히 안 되는 부분이 있어서 이 부분은 교수님께 좀 봐달라구

부탁을 드렸는데 아직 답변이 없으십니다~ ㅎㅎ

답변 감사드리구, 구현한거 첨부합니당 ^^

소스도 올라갑니당.
알고리즘은 분명히 자신하는데 판별이 지대로 못하구 있네여 ^,^;

분명 자료가 캐스팅 될 때 문제가 된거라 생각되는데

암튼~ 보시면 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);}
}

신청하기





COMMENT

댓글을 입력해주세요. 비속어와 욕설은 삼가해주세요.

번호 제 목 글쓴이 날짜
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
<<  이전  1 2 3 4 5 6 7 8 9 10  다음  >>

수다닷컴 | 여러분과 함께하는 수다토크 커뮤니티 수다닷컴에 오신것을 환영합니다.
사업자등록번호 : 117-07-92748 상호 : 진달래여행사 대표자 : 명현재 서울시 강서구 방화동 890번지 푸르지오 107동 306호
copyright 2011 게시글 삭제 및 기타 문의 : clairacademy@naver.com