[완료] 다각형에 외접하는 직사각형 영역을 구하려면?

cppig1995의 이미지

다각형에 외접하는 직사각형 영역을 구하려면 어떻게 해야 하지요?
기하 알고리즘에는 문외한이라서 말이죠. OS의 graphics API 때문에 건드린 게 전부랍니다-_-

속편한 방법으로는 (GDI+를 사용하고 있으므로) 비트맵 하나에 그려보고 안 그려진 부분을 찾아보면 되겠습니다만,
막장일 것 같죠? 해당하는 좋은 알고리즘이 있을 것 같습니다.

Necromancer의 이미지

수학문제같네요.

일단 직사각형의 각 변의 길이를 구할때 주변 다각형이 직각삼각형이라면

직각삼각형의 경우 a^2=b^2+c^2이라는 유명한 공식이 있습니다. 이거 증명하는 방법도 31가지나 나와 있습니다.
여기서 a는 가장 긴 변(직각인 각을 마주보고 있는 변)이고, b와 c는 직각을 끼고 있는 나머지 2개 변입니다.

직각삼각형이 아닌 경우는 위 공식이 좀 변형되는데(삼각함수가 추가), 생각이 안나네요.
그리고 비 직각삼각형의 경우 면적을 구하는 공식이 1/2 * a * b * sin (alpha)가 됩니다.
alpha는 삼각형의 어느 한 각의 각도, a와 b는 그 각도를 끼고 있는 변입니다.
두개 변과 각 두개 알고 있으면 이걸 응용해서 다른 변 길이 알아내버릴 수도 있습니다.

만일 삼각형이 아니다. 그러면 삼각형으로 쪼개면 됩니다.

궁금하시면 고등학생이 보시는 "수학의 정석"을 보심이.

Written By the Black Knight of Destruction

Written By the Black Knight of Destruction

7339989b62a014c4ce6e31b3540bc7b5f06455024f22753f6235c935e8e5의 이미지

각 꼭지점의 x좌표/y좌표 최솟값/최댓값을 구하면 될 것 같은데 한번 해보시죠; 대충 의사 코드로 이렇게?

polygon = [(1, 3), (4, 5), ...]
x1 = min(map(lambda (x, y): x, polygon))
x2 = max(map(lambda (x, y): x, polygon))
y1 = min(map(lambda (x, y): y, polygon))
y2 = max(map(lambda (x, y): y, polygon))
jick의 이미지

다각형에 외접하는 "x/y축에 평행한" 직사각형이라면 위의 ditto 님 방법대로 하시면 될 테고,

다각형에 외접하는 "임의 방향의" 직사각형이라면 일단 다각형을 완전히 둘러싸는 볼록다각형(convex hull)을 구한 뒤 직사각형 틀을 조금씩 돌려가면서 가장 면적이 작아지는 방향을 찾으면 되겠네요.

기하 과련 알고리즘의 특성이 말로 하면 한줄인데 코드를 짜면 케이스가 구만가지씩 나오는 거라 pseudocode는 자신없습니다. 알고리즘 책을 찾아보시는 게 빠를 듯. -_-;; (Convex hull로 찾아보면 아마 뭔가 관련된 것들이 있을 것 같네요.)

cppig1995의 이미지

아-_- 진짜 그렇게 하면 되는군요.
아무래도 ditto님 답변 보니까 제가 오늘 최대한 멍청해진듯-_-

(의도는 x, y축에 평행한 직사각형입니다.)
--
임수서룬뫼 윤희수 {cppig1995/돼지군}

Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.