직선위의 좌표구하기...

oldbell의 이미지


------------------------ 답변 주신분의 지적에 따라 질문을 수정했습니다. -------------

ax+by+c=0의 직선위의 점 m,n와 d만큼 떨어진 점의 좌표(x',y')를 구하려고 합니다.

x축을 기준으로 각도가 예각인 경우의 좌표를 찾으려는데요..( a,b,c,d의 값은 알고 있습니다.)

| ax' + by' + c | / sqrt( a^2 + b^2 ) = d 에서

x',y'의 값을 어떻게 구해야 할지.. 막히네요...

조언을 부탁드립니다.

정태영의 이미지

뭘하고 싶으신건지는 모르겠지만.

am+bn+c = 0
(x-m)^2 + (y-n)^2 = d^2

이렇게 두가지 식을 푸셔야겠는데요... 보심 알겠지만 서로 구하려는 변수가 다릅니다. 위의 식에서의 미지수는 m, n 이구요. 아래 식에서의 미지수는 x, y, m, n 이 됩니다.

네 가지 미지수에 대한 근을 찾으려면 서로 독립적인 식 네가지가 나와야 하므로 이 식은 underconstraint 상태로 해가 무한히 많습니다.

잘 생각해보시면 m, n 이 고정되지 않는 이상 x, y 는 ax+by+c = 0 직선을 중심으로 하는 두께 2d 짜리 선이 되는 것을 알 수 있습니다. 잘 모르시겠다면 직선을 따라 움직이는 반지름 d 짜리 원을 생각해보세요. 이 원의 중심이 m, n 이 되는거고, 이 원의 궤적이 원하시는 x, y 가 되는 겁니다.

--
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

oldbell의 이미지

먼저 답변에 감사드립니다.
다시 설명드립니다.

직선의 방정식 ax+by+c=0 위의 점 m,n 에서 d 만큼 떨어진 새로운 좌표 x', y'을 구하는 것이 문제입니다.
(직선의 방정식의 a,b,c와 점 m,n 거리d의 값은 알고 있습니다.)

| am + bn + c | / sqrt( a^2 + b^2 ) = d 의 식은 (식에서의 m,n은 사실 x', y' 입니다.)

d를 알때에 m,n은 두가지가 나올 수 있는데 이를 방지하기 위해 sin() 값이 예각인 경우의 좌표만 구하는 것입니다.

참고를 위한 코드입니다.

struct {
	double a,
	double b,
	double c
} Line;
 
struct {
	double x,
	double y
} Position;
 
/* 직선의 방정식 위의 점 p1에서 dist 만큼 떨어진 점 구하기 */
public Position getPos(Line L1, Position p1, double dist, bool radian) 
{
 
	// ...
	Position newPosition;
 
	// newPosition.x, newPosition.y구하기
	// radian = true 이면 예각의 좌표, false이면 둔각의 좌표
 
	// 식1: (L1.a * p1.x) + (L1.b * p1.y) + L1.c = 0 
	// 식2: | (newPosition.x * L1.a) + ( newPosition.y * L1.b ) + L1.c | / sqrt(a^2 + b^2) = dist;
 
 
	// 구하는 값 ----------
	// newPosition.x
	// newPosition.y;	
}

인생의 무게를 느껴라. 아는 만큼 보이는게다.

snowall의 이미지

x축을 기준으로 한 예각이라는 조건만으로는 답이 2개인 경우도 있겠는데요...

--------------------------
snowall의 블로그입니다.
http://snowall.tistory.com

피할 수 있을때 즐겨라! http://melotopia.net/b

정태영의 이미지

a, b, c, m, n 을 알고 있고, (m,n) 으로부터 d 만큼 떨어진 점 x', y' 를 계산하고 싶고 이 x', y' 도 ax+by+c = 0 직선 위에 있다고 한다면...

중간 값 정리를 이용해서 풀면 될 거 같습니다.

우선 x' = m/2 으로 잡구요. y' = -(ax'+c)/b = -(am/2+c)/b 가 되겠죠. 그 다음 (x'-m)^2+(y'-n)^2 을 계산해서 이 값이 d^2 보다 클 경우 x 를 m 쪽으로 조정시키고, d^2 보다 작을 경우 x 를 0 쪽으로 살짝 조절해주는 방법을 이용하면 됩니다.

x_min = 0;
x_max = m
 
do {
  x_ = (x_min + x_max) / 2
  y_ 계산
 
  diff = (x_ - m)^2 + (y_ - n)^2 - d^2
  if( abs(diff) < THRESHOLD )
    break;
 
  else if ( diff > 0 )  
    x_max = x_
 
  else
    x_min = x_
 
} while ( 1 );

pseudo code 로 나타내면 위와 같습니다.
--
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

snowall의 이미지

가장 정확한 방법은 (d,0)을 찍은 후 arctan(-a/b)만큼 회전시키고 m,n을 지나도록 평행이동하는 방법이 될 것 같군요.
나눗셈에 제곱근까지 들어가면 오차가 클 것 같아요.

--------------------------
snowall의 블로그입니다.
http://snowall.tistory.com

피할 수 있을때 즐겨라! http://melotopia.net/b

wsmrdo의 이미지

x' = d * cos(각도) + m;
y' = d * sin(각도) + n;

각도는 예각이니 -PI/2 ~ +PI/2 .

이게 젤 간단할 듯 하군요.

나그네나그네의 이미지

이 분 방법이 가장 오차가 작고 심플한 방법입니다 -_-ㅋ 탄젠트 값이 주어졌으니
----------------
agidari.wordpress.com

auditory의 이미지

(m,n) 으로부터 거리가 d인 점은
(m,n)을 중심으로 하고 반지름 d인 원위의 모든점이 되는데요..
무수히 많겠죠..

그럼 x',y' 도 직선위에 있어야하는건가요?

그렇다면 위의 원과 직선의 방정식을 연립해서 풀면되겠네요.

(x-m)^2+(y-n)^2 = d^2 --- (1)
ax+by+c=0 --- (2)

해가 두개 나올테고 이중에 원하시는놈을 골르세요

아니면 더 쉽게 윗분 말처럼 각도를 이용하시죠..
각도는 arctan(직선의기울기) 니깐 이걸 위의 분의 답에 대입하면 되겠네요.

snowall의 이미지

아마 직선으로부터 d만큼 떨어진 점을 찾는 것이 원래 질문하신 분의 의도인 것 같은데요.
만약 직선 위에 있는 점이라면, 그냥 1차 연립 방정식으로도 풀립니다.

--------------------------
snowall의 블로그입니다.
http://snowall.tistory.com

피할 수 있을때 즐겨라! http://melotopia.net/b

auditory의 이미지

아하 그렇군요.. 이제야 이해가가네요.. ㅠ.ㅠ

그럼 기울기를 직선과 수직하는 직선의 기울기로 하면되겠군요..

arctan(-1/직선의기울기)의 두 각도 중에 원하는 각 구해서 위의 식에 대입하면 되겠네요.

아마도 snowall 님이 제일 먼저 올리신 해답과 같아질것 같습니다.. ㅎㅎ

endofhope의 이미지

y' = bd/sqrt(a^2+b^2) +n
x' = ad/sqrt(a^2+b^2) +m

왜냐하면
(x',y') 와 (m,n)을 연결하는 직선의 방정식은 ay = b(x-m) + an
따라서 ay' = b(x'-m) + an
거리가 d 이므로 (x'-m)^2 + (y'-n)^2 = d^2
결국 ( (a/b)^2 + 1)(y'-n)^2 = d^2
그러므로 y'-n = sqrt( (b^2d^2)/(a^2 + b^2) )

말해질 수 있는 것은 분명하게 말해질 수 있다;
말할 수 없는 것에 대해서는 침묵해야한다.
논리철학논고 - 루드비히 비트겐슈타인

--
말할 수 있는 것은 분명하게 말해질 수 있다;
말해질 수 없는 것에 대해서는 침묵해야한다.
논리철학논고 - 루드비히 비트겐슈타인

오호라의 이미지

30cm 이내면 30cm자로 재어본다.

10m 이내라면 줄자로 재어본다.

100m 이상이라면 네이버지도 콤파스를 이용한다.

(^^;)

Hello World.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.