C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[922] 3점을 지나는 원의 방정식을 구하는 보다 간단하고 빠른 방법
Nibble [gameover] 24316 읽음    2009-10-29 14:27
void __fastcall Get3PointCircle(const TRealPoint* p, double& cx, double& cy, double& r){
    double dy1, dy2, d, d2, yi;
    TRealPoint p1((p[0].x + p[1].x) / 2, (p[0].y + p[1].y) / 2);
    TRealPoint p2((p[0].x + p[2].x) / 2, (p[0].y + p[2].y) / 2);
    dy1 = p[0].y - p[1].y;
    dy2 = p[0].y - p[2].y;
    r = 0;
    if (dy1 != 0){
        d  = (p[1].x - p[0].x) / dy1;
        yi = p1.y - d * p1.x;
        if (dy2 != 0){
            d2 = (p[2].x - p[0].x) / dy2;
            if (d != d2) cx = (yi - (p2.y - d2 * p2.x)) / (d2 - d);
            else return;
        }
        else if (p[2].x - p[0].x == 0) return;
        else cx = p2.x;
    }
    else if (dy2 != 0 && p[1].x - p[0].x != 0){
        d  = (p[2].x - p[0].x) / dy2;
        yi = p2.y - d * p2.x;
        cx = p1.x;
    }
    else return;
    cy = d * cx + yi;
    r  = sqrt((p[0].x - cx) * (p[0].x - cx) + (p[0].y - cy) * (p[0].y - cy));
}


30줄이 안되는군요
크레브 [kkol]   2009-11-03 13:48 X
잘만드셨네요
함수 리턴값을 bool로 하는게 사용하기에는 좋을것 같습니다.
결과가 제대로 나왔는지 안나왔는지를 함수를 쓰는 사람이 알아야 하니까요 ^^
Nibble [gameover]   2009-11-03 20:18 X
처리가 제대로 되지 않는 조건 (수평, 수직 혹은 대각선 처럼 세 점이 하나의 기울기를 갖는 경우) 에선 반지름을 0이 되게 처리했기 때문에 예외처리에는 문제가 없다고 생각합니다.
습관적으로 bool 을 리턴하는 코드는 의미없는 예외처리를 강요하게 되는 경우에 해당하죠.
좌표계상에서의 원의 중심 좌표는, 0도 될 수 있고 무엇도 될 수 있습니다만, 반지름은 0이 아니길 기대하죠. 만약 그렇다면 인자의 세 점의 좌표가 하나의 점이었다는걸 의미하니까요. 그렇지 않은 상황에서 반지름이 굉장히 작은 어떤 값을 갖게 될 경우, 이 함수를 이용하는 코드는 리턴값의 bool 을 통과했다 해도 예기치않은 연산결과를 낳을 수 있습니다. 가령, 후에 반지름을 다른 연산의 분모로 이용한다든지 하는 케이스가 예가 되겠죠. 애초에 반지름에 대한 예외처리가 필요하다면, 리턴값과 반지름에 대해 확인하게 만드는 코드 구조보다, 보다 의미 있는 반지름만의 확인에 집중하게 하는 편이, 쓸데없는 예외처리도 줄이고, 코드도 간단하게 만들며, 보다 무결성이 보장되는 코드를 만들도록 도와준다고 생각합니다.
Nibble [gameover]   2009-11-03 20:24 X
요약컨데, 7번째 줄의 r = 0; 하나가 25째줄의 r = ~~ 문과 중언부언하는듯 보일지 몰라도, 왜 그렇게 했을까를 생각해 보면, 이 코드에 담긴 철학을 이해하도록 만들어주는 힌트인 셈이죠.
크레브 [kkol]   2009-11-04 19:36 X
말씀하신대로 예외처리에는 문제가 없습니다만.
함수 선언(header)만 봤을때 bool 리턴이 직관적이라는것 때문에
습관적인 bool 리턴 함수를 선호합니다.
아마도 우리 회사에서 Nibble님과 같은 함수를 만들면 bool 리턴 함수로 바꾸라고 할겁니다.
이런 것은 어느 방식이 좋다 나쁘다 해봤자 쓸모없는 논쟁일것 같네요.
그냥 개인적인 의견으로 생각하시길..
Nibble [gameover]   2009-11-05 21:11 X
이런 문제야 말로, 논쟁이 의미있는 부분입니다.
효과적인 프로그래밍에 관련된 논문들을 읽어보시면, 무의미한 예외처리나 NULL을 전달하는 파라메터에 유의하라는
경고들이 흔히 등장합니다.
아마도 그 회사에선 그것이 그닥 논외의 대상일런지 모르지만 말이죠.
개발자들 안에선 이미 "생각하고 사용해야 할 메서드들에 대해서는 생각하게 하자"는게 상식으로 통한다고 생각되네요.
그리고 애초에, 잘만드셨네요. 제대로 나왔는지 안나왔는지를 알아야 하니까요 라고 말씀하신 부분과,
예외처리에는 문제가 없습니다. 쓸모없는 논쟁일것 같네요. 란 말씀은 상충되고 계신것 같군요.
Nibble [gameover]   2009-11-05 21:17 X
전 위의 덧글에서 분명히 예로 들었습니다.
이 함수를 수행한 결과가 반지름이 0가 될때의 가져다 쓰는쪽에서 논리적으로 발생하게 될지 모르는 문제들에 대해서
말이죠.
또한, 크레브님의 말을 빌자면 거의 모든 함수 호출은 bool 을 가져야 한다는건데, void 형 함수는 왜 존재하는 것일까요?
또, bool 타잎의 리턴을 강제하는 코드들에서 결과가 true가 나왔을때의 결과를 100% 신뢰할 수 없다면 그게
의미 있는 행위일까요?
엎어치나 매치나 하는 문제면 왈가왈부의 의미가 없음이 분명하겠지만,
이 코드를 가져다 쓰는 사람들은 예외처리 하나가 줄게 됨이 분명하고, 함수를 implementation 하는 입장에서도
의미없는 true false 를 return 하는것 보다, 최소한 타이핑 몇 번은 줄게 되는 것 같군요.
객체화가 중복과 무의미한 엔트로피의 소거에서 출발한다면,
잘 모듈화된 함수화 역시 무의미한 엔트로피의 소거가 필요한게 아닐까요?
애초에, 결과로 r 이 0 이 되는 경우는 원을 구성할 수 없는 인자가 전달된 경우다. 라고 명시했다면
이런 이야기가 시작 되지도 않았겠죠 : )
몇 줄 되지도 않는 코드에 주석이 필요한가 라는것도 단순한 아집일지 모르구요.
생각하고픈 사람들은 생각하고, 무시하고픈 사람들은 무시할 수 있는 계기가 되었으면 다행이라고 생각합니다 : )
Nibble [gameover]   2009-11-05 21:23 X
앞서 크레브님이 올리신글과 덧글에서,
오류가 있으면 알려달라는 말씀에 제가 생각하는 바를 인터렉션하자는 취지에서 작성된 함수와 덧글들일 뿐이구요,
오래전에 작성한 코드고 굳이 개선할 필요를 못 느껴 써 오고 계신다는 상황은
bool 을 리턴하거나 말거나의 문제보다 보다 심각해 보입니다.
재사용 가능한 Core 함수일수록 고찰이 필요함이 당연한 것이구요.
작업하고 계신파트가 어느정도 성능에 free 한 환경이실런진 모르지만,
아래의 글이 단지, 원의 방정식을 가우스 소거법으로 유도해보았습니다. 정도가 아니라,
사용하고 계시다면, 흠좀무 한 상황이라고 느껴지네요.
Nibble [gameover]   2009-11-05 21:37 X
이렇게 말하고 나니 뭐 저 코드가 굉장히 잘 만들어진 코드다 라고 말하는 것 같은데,
double 형의 표현범위에 대해 생각하고 연산순서에 대한 튜닝을 한다면 저것보다 4배 더 정확한 코드도
나올 수 있겠죠. 그런 코드를 누가 올려주신다면, 아이고 감사합니다. 할 지경입니다.
저도 이런 함수를 쓰게 되는 날이 올지도 모르고 말이죠.
크레브님이 올려주신 코드에서 누군가가 아주 유용하게 가우스 소거법 부분만 뜯어내서 쓰게 되실지도 모릅니다.
하지만, 핵심인 원의 방정식을 구하는 문제에 있어선 먼 길을 돌아간 코드이기에
성능이건 정확도건 비교할 수 없는 상황임에 분명하고,
빠른 성능과 정확도를 필요로할 많은 연립방정식, 다항식의 계수를 구하거나 회귀분석을 하려는 경우는 아래에 표현된
가우스 소거법보다는 처리 성능이 고려된 Gauss Jordan 이나 Gauss Seidel 의 robust한 형태의 변종 기법들이 사용되겠죠.
Nibble [gameover]   2009-11-05 21:42 X
정리하죠. 이런 논의들은 의미있는 논의입니다. 초월한 수준의 프로그래머들에겐 진부한 이슈들이겠지만 말이죠.
그런 프로그래머들이 있다면, 이런 논의를 거쳤던 과거가 있었을테구요.
자신의 코드가 한 번이라도 재사용되길 바라는게 개발자의 로망이라면,
기반 함수들은 작고 빠르고 깔끔하게 돌아가야 하는게 당연한 문제일겁니다.
코드 안에 철학이 있어야 함수 하나가 아니라 라이브러리, SDK 수준으로 확장되어 갈 때도 다른 사람들이
쉽고 안전하고 유용하게 쓸 수 있을테구요.
크레브 [kkol]   2009-11-06 12:40 X
제 첫번째 답글은 r=0 으로 예외처리를 하려는 의도를 생각하지 못했기 때문이고
다음 답글은 Nibble님의 글을 보고 답글을 올린것이니.. 내용상 상충되는게 당연하지 않나요?
제 글이 이랬다 저랬다 왔다갔다 하는것처럼 생각하시면 곤란합니다.
그리고 고등학교수준의 수학실력에서 생각나는게 가우스 소거법밖에 몰랐기 때문에 오래전에 그렇게 코딩한것이고요
Nibble님의 방식은 이후에 알고는 있었지만 말씀드린대로 오래전부터 써왔지만
사실 지금 그렇게 중요하게 사용하는 코드가 아니기 때문에 개선할 필요성을 못 느낀다는겁니다.
크레브 [kkol]   2009-11-06 12:47 X
원의 방정식을 수백만번 구하는 용도가 아니라면 속도 차이는 크게 이슈가 아니나...
Nibble님이 훨씬 깔끔하게 만드신 코드를 올렸으니.. 다음에 쓸일이 생기면 감사히 잘 쓰겠습니다.
다만 bool 리턴 방식에 대한 얘기는 처음 생각대로 그렇게 의미있는 논의는 아닌것 같네요.
위와 같은 함수를 초보개발자들도 쓸 수 있기 때문에 bool 리턴 방식을 여전히 선호합니다.
예외처리의 용도로 r에 0을 넣었다고 생각하지 못하는 개발자들도 있겠죠
오히려 정상적인 경우에 r이 0에 너무 가까운 값이 나올게 걱정이라면
그 조건을 체크해서 false를 리턴하면 됩니다.
크레브 [kkol]   2009-11-06 12:53 X
true가 나왔을때 100% 신뢰할수 있게 조건을 체크해서 리턴하면 아무 문제 없습니다.
bool 리턴 방식으로 하면 예외처리가 늘어난다고 하시는건 좀 억지 아닐까요?
1.
if( Get3PointCircle(..) == false )

2.
Get3PointCircle(... r);
if( r == 0)

위 두가지 방식에서 2번 방식이 그렇게 예외처리가 간단하고 타이핑도 줄어듭니까?
이는 단지 함수 만드는 사람의 스타일이 다를 뿐이라고 생각합니다.
Nibble [gameover]   2009-11-06 13:49 X
아이러니하게도 저는 크레브님의 방법을 봤을 때 중학교 수준의 산수가 생각나서 작성했던 것이라죠.
상충된다고 한 것은, 여러가지 의미가 있습니다. 위 아래 뿐만아니라 같은 녀석들 안에도 미묘한 부분이 있으니까요.
코드를 주마간산격으로 본다든지, 쓸모가 없는 논쟁같다면서 굳이 토를 달고계신 모습이 말이죠.
아직 개념을 못 잡으신 것 같은데, 비교를 하려면
if (Get3PointCircle(.., r)){
   ....
    if (r > 0) axx = axx / r;
    else...
}

와,
Get3PointCircle(..,r);
if (r < MIN_THRESHOLD) ...

를 비교하셔야죠. 비단 r이 단독으로 분모로 쓰이는 경우뿐만 아니라, 다른 수식과 함께 쓰일때도 특정값 보다 작으면 오차값이 튀어오를 수 있지 않겠습니까? 그래서 double 연산의 0 처리는 공학에선 범위로 하도록 권장하고 있고 말이죠.
그렇다면 bool 방식은 초보 개발자들이 쓰고, r 방식은 초보자가 못 쓸 수준이란 말입니까?
넌센스네요. 주석까지 달아 놓으신 350줄 보단 이쪽 코드가 분석하고 오류찾기 쉬워보이는데 말이죠.
Nibble [gameover]   2009-11-06 13:59 X
그쪽 회사였다면 bool 로 고치라고 할것이라고 말씀하신 부분을 보고 사실 조금 더 웃겼는데 말이죠.
인신 공격같아 자제했었는데,
만약 제가 수석연구원으로 있는 우리 회사에서 크레브님 처럼 조언을 조언으로 받아들이지 못하고, 습관에 젖은 코딩에 고집스럽게 변호하는 사람이 있다면, 전 정말 그 사람 책상 뺐을겁니다.
코딩은 프로그래머가 편하자고 짜는게 아닙니다. 물론 편하면 좋지만 프로그래머의 편의가 고려되는 순서는 다른 순서들에 비해 한 참 뒤에있지 않습니까?
크레브 [kkol]   2009-11-06 14:12 X
제가 위에서 "r이 0에 너무 가까운 값이 나올게 걱정이라면 그 조건을 체크해서 false를 리턴하면 됩니다." 라고 썼습니다만
남의 글은 제대로 안읽고 답글을 올리시니 할말이 없군요
제가 올린 코드가 350라인인지는 몰라도 제 코드가 분석하기 쉽고 오류찾기 쉽단 얘기는 한마디도 안했습니다.
왜 상관없는 말씀까지 하시는지 모르겠군요.
다른 모든 사람이 소스코드를 확인하고 쓰는가와 그냥 쓸 수도 있겠다의 관점 차이인데
뭘 그렇게 대단하게 하시는지 모르겠습니다.
Nibble님이 쓴 방식이 초보자가 못쓸 수준 아닙니다! 그렇게 쓴 적도 없고요
단지 초보자가 실수 할 수 있는 가능성이 더 있다는 의미지요.
크레브 [kkol]   2009-11-06 14:16 X
저도 정리해 볼까요..
첫번째 댓글은 예외처리가 안되 있는줄 알고 댓글 달았습니다.
두번째 재 댓글은 개인의 차이로 쓸모 없는 논쟁이라고 했고요
그 내용에서 bool고치라고 할거라고 해서 . 기분이 상하셨나보군요. 그렇다면 그부분은 사과합니다
하지만..여전히 쓸모 없는 논쟁이라고 생각하는데는 변함이 없군요
Nibble [gameover]   2009-11-06 14:21 X
제일 위험한 경우는, bool 값이 false면 처리 안했으니 이 코드가 문제가 없다고 생각한 초보 프로그래머가 산술 연산상의 누적 오류로 황당체험을 했을 때 빠지는 혼란이라고 생각합니다.
또, 어떤 사람은 위의 코드 말미에 if (r < ~~) return false; 를 추가할 수도 있겠죠. 혹은 bool 이 아니라 오류 종류에 따라 친절히 enumeration 해서 에러코드를 리턴해 줄 수도 있겠죠.
문제는, 유효한 오차의 범위란것도 상대적이고, 어떤 경우엔 내가 강제로 cut off 해버렸지만 그걸 써야하는 사용자 케이스도 있고, 어떤 경우엔 내가 safe 처리 했지만, 그 오차때문에 정상 작동을 못하는 경우가 있다는거죠. threshold를 누가 판단해야 하느냐는 사용자측에 있다고 보는겁니다. 자 보세요. 그럼 이렇게 정리가 되죠.
오류냐 아니냐의 결과를 크레브님은 이진화 해서 리턴했습니다. 결국 결과값을 돌보기 위해 사용자는 r값을 care해야합니다.
반대로 제쪽에선 오류냐 아니냐를 r에 집중시켜 double 값으로 돌려준 셈이구요. 여러번 말씀드리게 됩니다만 어차피 결과값을 돌보기 위해선 r을 봐야 하니까요. 사용자에게 전해진 오류에 대한 엔트로피는 간결하게도 하나에 집중되어 있습니다.
r은 r대로 둘 다 결과로 주게 되겠지만, 크레브님의 코드를 가져다 쓸 수 있는 사용자나 분야나, 시스템이 한정됨에 비해 제 코드는 확장성을 갖게 된다고 생각합니다.
오류냐 아니냐 판단을 크레브님이 내려버렸다면 크레브님이 사용하는 형태와 다른 사람들의 사용예에서는 오류라고 판단했음에도 값을 처리해야 하거나, 오류가 아니라고 판단했음에도 오류처리를 해야 하는 사태가 벌어질테니까요. 당연하게도 생화학적 분석이나 좀 큰 이미지 안의 많은 spot과 circle을 다루는 처리에 크레브님의 코드는 사용되어선 곤란할테고, 만약 하드웨어 성능으로 커버하려 든다면 사양이 올라가는건 자명한것이구요. 이거 뭐 MS도 아니고.
Nibble [gameover]   2009-11-06 14:24 X
Nibble님이 쓴 방식이 초보자가 못쓸 수준 아닙니다! 그렇게 쓴 적도 없고요 <---
위와 같은 함수를 초보개발자들도 쓸 수 있기 때문에 bool 리턴 방식을 여전히 선호합니다 <---
Nibble [gameover]   2009-11-06 14:25 X
아무렇게나 생각하면 엎어치나 매치나겠지요 : )
확률과 빈도 안에서 효율을 논하는것 아니겠습니까?
쓸모없는 논쟁을 시작해 주셔서 감사할 따름입니다.
Nibble [gameover]   2009-11-06 14:30 X
사실 크레브님은, 포럼안에서 활동도 왕성히 하고 계시고, 영양가 있는 글도 많이 올려주시는 분이라 생각하기 때문에
'부딪힐' 의도는 없었습니다.
좀 욱하는 부분도 있었지만 크레브님 아드님 사진도 눈에 어른거리고 해서 참은 구석도 있었구요.
뭐 어쨌거나,
우리 두 사람이 지금 나눴던 대화의 입장 어느쪽이 어느쪽이건 간에 진보와 보수로 구분해 본다면,
언젠가 다른 사람 앞에서 반대의 역할을 하게 될지도 모르죠.
중요한건, 생각하느냐 귀찮아서 대충 대충 하느냐의 차이 정도랄까요. 앞서 말씀드렸듯,
생각하고픈 사람들은 생각하고, 무시하고픈 사람들은 무시할 수 있는 계기가 되었으면 다행이라고 생각합니다 : )
크레브 [kkol]   2009-11-06 14:31 X
위의 함수를 소스 코드 형태가 아닌 dll이나 lib 처럼 바이너리로 제공한다면
헤더에서
void __fastcall Get3PointCircle(const TRealPoint* p, double& cx, double& cy, double& r);
를 본다면 따로 명시적 설명이 없는한 r에 0이 들어있을때 예외라는것을 판단하기 힘듭니다.
또한 명시적 설명이 있다해도 그것을 봐야 알 수 있는것이고요

bool __fastcall Get3PointCircle(const TRealPoint* p, double& cx, double& cy, double& r);
하지만 bool 리턴이 있다면 선언만 봐도 직관적으로 쓰는 사람이 판단 할 수 있다는겁니다.
저는 오히려 이런 점에 더 가중치를 줘야 된다고 생각합니다.

굳이 판단 기준이 애매하다면..
bool __fastcall Get3PointCircle(const TRealPoint* p, double& cx, double& cy, double& r, double dMinR=0.0001);
이렇게 해서 확장성 있게 해놓고 , 엄청 작은 r이 필요한 사람이 확장해서  쓸 수 있게 해도 되겠지요
하지만 그 정도까지의 필요성은 느끼지 못했습니다.
각자 개발 업무 영역이 다르니까 업무 내용에 맞게 함수를 만들면 될겁니다.
Nibble [gameover]   2009-11-06 14:52 X
저 역시 주석이나 메뉴얼, 도움말 보다는 코드로 모든것을 말해야 한다는 철학을 갖고 있습니다.
하지만 그렇게 다 할 수 없는 부분도 분명히 존재는 하구요.
소스를 오픈하는 코드니 저렇게 했지, 패키징을 했다면 저 역시 그 부분에 대해 다르게 implementation 했을 수 있구요.
결과적으로,
조금은 소모성인 이 댓글 논쟁들로 인해 팁을 가져가는 분들도 있었으면 좋겠군요.
비단, 코딩 스타일이나 철학의 문제 뿐만 아니라, 각 분야에서 완고한 개발자들끼리의 대화방법에서 '이러면 안되는구나' 하는 나쁜 예를 통한 깨달음일지라도 말이죠.
한가지 아쉬운점은, 우리 처럼 통밥굴러가는 개발자들이라면 잘 짠 코드와 잘못된 코드를 척 보면 안다는 거죠. 잘 짠 코드라 생각되면 들여보게 마련이구요. 그럼에도 두 사람 다 서로의 코드를 별로 들여다보고픈 생각이 들지 않았다는 거겠지요 : )
Nibble [gameover]   2009-11-06 15:12 X
어차피 길어진 댓글 사족을 하나 더 달아봅니다.
upperThreshold 랑 lowerThreshold 를 인자로 던지지 않은것은, 스택 사용량을 줄이고, 인자를 전달하는 만큼의 cost를
절감하기 위해서였습니다. 성능에 영향을 미치니까요.
어떤 의미에선 인자로 전달되는 스택을 caller가 비우느냐 callee가 비우느냐 하는 문제와 비슷하게 보일런지도 모르겠지만,
적어도 성능에 있어선, 사용자가 r 을 care하는게 낫습니다. upperThresold 나 lowerThresold 둘 중 하나는 don't care일 수도 있고, 둘 다 don't care일 가능성도 있으니까요. 뭐 그런 취지란 겁니다.
정확하고 빠르고 코딩이 간단하면서도 일관성을 갖고 사용자를 설득할 수 있으면 된다는 입장인것이죠.
Nibble [gameover]   2009-11-06 15:31 X
지문인식이나 DNA 칩 안에 뿌려진 Spot을 감지하는 등의 패턴인식 이슈들에선 어차피 복합 형태로 threshold가 주어지게 됩니다. 원시 함수 작성자가 그걸 다 케어해서 bool 로 처리하게 하는건 거의 불가능한데다 (HRGN같은거라도 인자로 받을껀지), 그런식으로 성능을 떨어뜨리느니, 간단하잖습니까? 사용자에게 r만 맡기면 됩니다.
용맨소녀 [doyongid]   2009-11-06 17:49 X
3점을 잇는 포물선 공식 소스를 찾고 있었던 참이었는데, 아깝네요.. 크흑..

그나저나 30줄이 안되는 코드로 이렇게 많은 논쟁이 오고 가는걸 보면 프로그래밍도 깊고 오묘하다는 것을 깨닫게 하네요..
Nibble [gameover]   2009-11-09 17:05 X
3점을 잇는 포물선 공식은 다항식 근사로 보면 간단하고 종류도 다양하지만,
목적이 분명해야 적당한 모델을 추천해 드릴 수 있을 것 같네요.
가로 간격이 일정한 어떤 데이타에서 Peak(최고치)을 찾는다. 라거나, 정말 단순히 그냥 3점으로 2차함수를 추출하면 된다라거나 등의 힌트 말이죠. 후자라면 뉴튼법을 쓰든, 뭐를 쓰든 크게 문제 될일이 없는데, 현실속에서 3점 2차로 완전히 근사되는 모델이 그다지 많진 않기 때문에 좀 더 단서가 필요할 것 같습니다.
용맨소녀 [doyongid]   2009-11-11 02:22 X
Nibble//제가 쓸건 3점을 지나는 포물선이고, 그 중 한 점은 촛점이어야 합니다.

x좌표를 대입하면 y좌표가 나오는 식이면 좋을 것 같네요.. 아니, 거기서 더 나아가 시작점에서 끝점까지의 좌표를 모두 구하는 형식이 낫겠습니다. 저 밑에 905번인가 곡선그리는 소스를 보면 간격을 지정해주면 그 간격에 맞추어서 좌표를 모두 구해주더군요..

아무리 공식을 알아도, 이걸 막상 소스로 구현하려니까 답이 안나오네요..ㅡ.ㅡ 원래는 sin, cos을 이용해서 대충 끼워맞춰서 구현했는데, 뭔가 궤적이 어색하더군요... 역시 포물선 공식을 제대로 대입해야겠더라고요..

장성호 [nasilso]   2009-11-11 15:24 X
음....

위 함수에 한가지 다음과 같이 입력하니 값이 이상하게 나오네요

    TDoublePoint p[3];
    double cx,cy,r;

    p[0].x=0;
    p[0].y=0;
    p[1].x=0;
    p[1].y=0;
    p[2].x=5;
    p[2].y=5;


    Get3PointCircle2(p,cx,cy,r);
    ShowMessage(FloatToStr(r));
    //r=5 이구

    p[0].x=0;
    p[0].y=0;
    p[1].x=1;
    p[1].y=1;
    p[2].x=0;
    p[2].y=0;

    Get3PointCircle2(p,cx,cy,r);
    ShowMessage(FloatToStr(r));
    //r=1 입니다.


세 점중 2점이 같으면, 그 두점을 지나는 원의 갯수는 무한대이므로..
이경우에 대한 처리가 필요할것 같습니다.

Nibble [gameover]   2009-11-12 15:05 X
앗, 감사합니다. 수정해 두었습니다.
핑계를 대자면, 일치한 두 점의 가로좌표가 +- 0.0000000000....00000000001 차이라도 있다면 저 답이 맞긴 해요 ㅋㅋ
죄송 'ㅁ'

+ -

관련 글 리스트
922 3점을 지나는 원의 방정식을 구하는 보다 간단하고 빠른 방법 Nibble 24316 2009/10/29
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.