태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

다각형 내/외부 판정 소스

2010/06/04 10:48

폴리곤과 한 점이 있을때 그 점이 폴리곤 내부에 포함 되는지 포함되지 않는지 체크.
첫점과 끝점이 같을 필요는 없음.

bool InsidePolyCheck(GPoint pt,GPoint* poly, int polycnt)
{
	int i, j;
	bool c = false;

	GPoint Ixy;
	GPoint Jxy;

	for (i = 0, j = (polycnt - 1); i < polycnt; j = i++) 
	{
		Ixy.x = poly[i].x;
		Ixy.y = poly[i].y;
		Jxy.x = poly[j].x;
		Jxy.y = poly[j].y;

		if ((((Ixy.y <= pt.y) && (pt.y < Jxy.y)) || ((Jxy.y <= pt.y) && ( pt.y < Ixy.y))) &&
			(pt.x < (Jxy.x - Ixy.x) * (pt.y - Ixy.y) / (Jxy.y - Ixy.y) + Ixy.x))
			c = !c;
	}
	return c;
}
크리에이티브 커먼즈 라이선스
Creative Commons License

유리한 코드창고

직선 각도재기.

2010/04/12 09:42
두 점을 잇는 직선의 각도를 잰다.

0~360도.

12시 방향이 0도.

GPoint는 double x,y.

double getAngle(GPoint centerPt, GPoint pt)
{
	pt-=centerPt;
	double angle = atan2(pt.x,pt.y) * 180 / 3.141592;
	return angle > 0 ? angle : angle + 360;
}
크리에이티브 커먼즈 라이선스
Creative Commons License

유리한 코드창고

사각형 중앙에서 외부의 한점까지 직선을 그었을때 사각형과의 접점.

2010/04/12 09:35

빡쳐서 수학책 샀긔
공비가 코드 짜줌. thanks, gongbi.


POINT getPoint(int x, int y,int cx, int cy)
{ 
	double m,dx,dy,off,result;
	POINT pt;

	if( y <= 0 ) off = 0.0f; 
	else off = 2*(double)cy;

	if( x != cx ) dx = (double)(x - cx);
	else 
	{
		pt.x = cx;
		if( y <= 0 ) pt.y = 0;
		else pt.y = 2*cy;

		//*r = 2;
		return pt;
	}
	if( y != cy ) dy = (double)(y - cy);
	else
	{
		if( x<= 0 ) pt.x = 0;
		else pt.x = 2*cx;
		pt.y = cy;

		//*r=2;
		return pt;
	}
	m = dy/dx;

	result = (m*(double)x-(double)y+off)/m;

	if( (int)result < 0 || (int)result > cx*2 )
	{
		if( x<= 0 ) off = 0.0f;
		else off = 2*(double)cx;
		result = m*(off-(double)x)+(double)y;

		pt.x = (int)off;
		pt.y = (int)result;
		//*r=1;
		return pt;
	}
	else
	{
		pt.x = (int)result;
		pt.y = (int)off;
		//*r=0;
		return pt;
	}
}
크리에이티브 커먼즈 라이선스
Creative Commons License

유리한 코드창고

std::string의 formating 시발 낚였다

2009/09/24 00:19

원문 :  http://blog.yurihan.net/entry/stdstring-%EC%9D%98-formating

시발 낚였다.. gcc에서 완벽히 정상동작을 보장하지 않는다.

문제의 발단은 이거다.



내가 지금 윈도우에서 만든 변환 프로세스를 리눅스로 포팅중인데,

ATL 떡칠. CString의 향연/ 처음보는 CMapStringToString / CMapStringToOb 따위가 늘어져 있는데

파싱후에 CString::Format이 많아서 위의 링크에 쓴대로 정의하고

.Format( -> = format( 으로 치환해서 돌렸다.

처음에는 별문제가 없는데 컴파일해서 돌리다 보니 뻗는다.

문제를 한참 보아하니 format에서 256 에서 끊어버리고 뻗는다. 코드상으로는 시발 실패하면 버퍼를 두배로 늘리면서 계속 루프를 도는데..

그래서 length를 256을 65535 로 늘려봤다.




뻗는다. 시발.





아직 부족한가 싶어서 500000 정도로 10배 약간 안되게 늘렸다.








느리다.......심하게.........




그리고 뻗는다.........






조그맣게 테스트 후로그램을 짜서 테스트를 해 보았다... 실패했을때의 리턴값이.. -1이 아니다..
(구글링 해도 뾰족하게 안나오고 man 페이지를 봐도 다른거랑 묶여서 확실히 안나오더라. 그보다 술기운이라 눈에 안들어온다.)


가능한 사이즈의 length 를 밷고 죽더라. (실패든 성공이든 리턴값은 가능한 사이즈...)

그래서 코드 수정.

근데 args 에서 SIGSEGV 날리면서 뻗음....................

시발 어쩔?




원래 저녁때 오버플로만 확인하고 사이즈를 오십만으로 늘린 뒤에 돌렸는데 너무 느려서 퇴근뒤에 술한잔 하고 들어와서 확인했는데 뻗어있더라.


가뜩이나 술 마셔서 정신도 없는데.. 시발..

이후 테스트로 대략 한시간에 걸쳐 확인되고 테스트 한 결과이다.

length를 찍어봤는데 지금 돌리고 있는 루틴에서 35457983을 찍는다.

그러니 오십만으로 택도 없지.. 자그만치 삼천 오백 서삽 오만..  50만 과 3천5백만.. ㅋ



대충 처리한 듯한 코드를 올려둔다. 참고들 하시라. (g++ 에서 돌렸다.)

stdargs는 알아서들 include 하시라.




int format_arg_list(std::string& out, int length, const char *fmt, va_list args)
{
    if (!fmt) return -1;
    int   result = 0;
    char *buffer = 0;

buffer = new char [length + 1]; memset(buffer, 0, length + 1); result = vsnprintf(buffer, length, fmt, args);
out = buffer; delete [] buffer; return result; }
std::string format(const char *fmt, ...) { va_list args; va_start(args, fmt);
std::string s; int length = 256; int result = format_arg_list(s,length,fmt, args); va_end(args); if(result >= 256) { va_start(args, fmt); format_arg_list(s,result+1,fmt, args); va_end(args); } return s; }


args 에서 뻗는건 그냥 va_start 한번 더 하는것으로 해결했고, 최초 length는 속도문제도 있고 하니 256으로 고정.

내가 지금 이 포스팅을 급하게 하는 이유는 내일이면 기억이 안날 듯 해서.

크리에이티브 커먼즈 라이선스
Creative Commons License

유리한 코드창고

  1. Blog Icon
    Only

    내가 지금 이 포스팅을 급하게 하는 이유는 내일이면 기억이 안날 듯 해서.
    ㅋㅋㅋㅋㅋㅋㅋ

  2. 그거슨 명백한 사실

  3. function이 -1 을 리턴했을때 예외처리는 알아서 하시라.

    현실적으로는 일어나기 힘든 일이지만 나는 책임지지 않으련다.

  4. 우왕ㅋㅋㅋ

  5. 내공은 삽질에 비례한다

for문 없이 별찍기

2009/09/18 14:51

// for 문 없이 다이아 몬드 만들기
#include <stdio.h>
#include <setjmp.h>
int main( void )
{
    int i = 0, j = 0;
    jmp_buf buf;
    setjmp(buf);
    printf( "%s", i>=8  ? j<i-8?" ":"* "
                        : j<8-i?" ":"* " );
    i = ( ++j == 8 )?( j = 0, printf( "\n" ), ++i):i;
    if( i != 16 ) longjmp(buf,0);    

return 0; }

굉장히 변태적인 방법.

codepad에서는 잘 안돌아가는듯. 직접 컴파일해야됨.
크리에이티브 커먼즈 라이선스
Creative Commons License

유리한 코드창고/변태코드

  1. Blog Icon
    chobabo

    정말 변태같은 코드네요^^

  2. 예, 그렇습니다.
    만들게 된 이유도 꼬꼬마들 숙제용으로 이대로 제출하고 F맞아라 라는 의미였으니 변태적일 수 밖에요.

  3. 한 function내에서 setjmp를 쓰다니요.. 불결합니다.

    goto짱도 할 수 있다구여!

    함수를 넘나들게 작성해주세요.! -_-

  4. 그렇게 짜면 꼬꼬마들이 레포트 제출용으로 부적합하다고 생각할거임 ㄲ
    setjmp 는 위대한듯. C의 exception 처리라니 ㅋ