Forth
http://fforum.winglion.ru/

Задача: симметричны ли точки на плоскости
http://fforum.winglion.ru/viewtopic.php?f=19&t=3177
Страница 1 из 1

Автор:  Hishnik [ Ср июн 13, 2018 21:41 ]
Заголовок сообщения:  Задача: симметричны ли точки на плоскости

Даны целочисленные координаты четырех точек в двумерном пространстве. Составить программу, которая определит, существует ли прямая, относительно которой пары точек будут располагаться симметрично.

Автор:  F-MAP [ Ср июн 13, 2018 22:41 ]
Заголовок сообщения:  Re: Задача: симметричны ли точки на плоскости

Уточните задачу, симметричная прямая не должна проходить не по одной точке?

Автор:  Hishnik [ Ср июн 13, 2018 22:47 ]
Заголовок сообщения:  Re: Задача: симметричны ли точки на плоскости

F-MAP писал(а):
Уточните задачу, симметричная прямая не должна проходить не по одной точке?

Там указано - "пары точек". Т.е. если лист бумаги "перегнуть" по какой-то прямой, то две точки наложатся на другие две.

Автор:  F-MAP [ Ср июн 13, 2018 22:52 ]
Заголовок сообщения:  Re: Задача: симметричны ли точки на плоскости

Допустим, две точки совпадают, две расходятся, по ним согнуть лист, это не верное решение?

Автор:  Hishnik [ Ср июн 13, 2018 22:57 ]
Заголовок сообщения:  Re: Задача: симметричны ли точки на плоскости

F-MAP писал(а):
Допустим, две точки совпадают, две расходятся, по ним согнуть лист, это не верное решение?

*
|
* | *
|
|
*

Вот в этом варианте явно несимметрично.

Автор:  F-MAP [ Чт июн 14, 2018 10:51 ]
Заголовок сообщения:  Re: Задача: симметричны ли точки на плоскости

Код:
\ на SPF  без SIN COS
\ исходные координаты структура
0
CELL -- x1
CELL -- y1
CELL -- x2
CELL -- y2
CELL -- x3
CELL -- y3
CELL -- x4
CELL -- y4
\ координаты прямой
CELL -- xн
CELL -- yн
CELL -- xк
CELL -- yк
CREATE krd ALLOT

\ анализ координат структура
0
CELL -- ax1
CELL -- ay1
CELL -- ax2
CELL -- ay2
CELL -- ax3
CELL -- ay3
CELL -- ax4
CELL -- ay4
CREATE akrd ALLOT

: ЗаполнитьИсходные  ( x1 y1 x2 y2  x3 y3 x4 y4 -- )
SWAP krd x4 2!
SWAP krd x3 2!
SWAP krd x2 2!
SWAP krd x1 2!
;

: ЗаполнитьАнализ  ( y1 x1  y2 x2  y3 x3  y4 x4  -- )
akrd x4 2!
akrd x3 2!
akrd x2 2!
akrd x1 2!
;

\ Проверить паралельность отрезков ax1 ay1 ax2 ay2 и ax3 ay3 ax4 ay4
: Паралельны? \ формула из геометрии
( -- f ) \ f = true - паралельны  DS>F F* F-  можно заменить на * -, но опасность переполнения разрядности
akrd ay4 @ akrd ay3 @ - DS>F
akrd ax2 @ akrd ax1 @ - DS>F F*
akrd ax4 @ akrd ax3 @ - DS>F
akrd ay2 @ akrd ay1 @ - DS>F F* F- F0=
;

: Координаты_Прямой
akrd x1 @ akrd x2 @ + 2/ krd xн !
akrd y1 @ akrd y2 @ + 2/ krd yн !
akrd x3 @ akrd x4 @ + 2/ krd xк !
akrd y3 @ akrd y4 @ + 2/ krd yк !
;

: Дист \ перпендикулярное растояние от точки x1 y1 до прямой xн yн   xк yк
krd yн @ krd yк @ - DS>F
krd x1 @ DS>F F* krd xк @ krd xн @ - DS>F krd y1 @ DS>F F* F+
krd xн @ DS>F krd yк @ DS>F F* krd xк @ DS>F krd yн @ DS>F F* F- F+
krd xк @ krd xн @ - DS>F FDUP F* krd yк @ krd yн @ - DS>F FDUP F* F+ FSQRT F/ F>DS \ деление на 0 может быть!
ABS
;

: Перпендикулярны? ( -- f )
krd x1 @  krd xн @ - DS>F F**2
krd y1 @  krd yн @ - DS>F F**2
F+ FSQRT F>DS Дист =
;

: ЕстьПаралельные?  ( x1 y1 x2 y2 x3 y3 x4 y4 -- f )  \ f = true есть такая
\ должны быть два паралельных отрезка
ЗаполнитьИсходные
krd x1 2@
krd x2 2@
krd x3 2@
krd x4 2@ ЗаполнитьАнализ
Паралельны? ?DUP IF EXIT THEN

\ следующая комбинация
krd x1 2@
krd x3 2@
krd x2 2@
krd x4 2@ ЗаполнитьАнализ
Паралельны? ?DUP IF EXIT THEN

\ последняя комбинация
krd x1 2@
krd x4 2@
krd x3 2@
krd x2 2@ ЗаполнитьАнализ
Паралельны?
;

: ЕстьСиметричная? ( x1 y1 x2 y2 x3 y3 x4 y4 -- f )
  ЕстьПаралельные? IF
  Координаты_Прямой
  Перпендикулярны?
                   ELSE
                   FALSE
                   THEN
;

Автор:  Hishnik [ Чт июн 14, 2018 14:46 ]
Заголовок сообщения:  Re: Задача: симметричны ли точки на плоскости

А есть вариант, когда не используется плавающая точка?

Автор:  Victor__v [ Чт июн 14, 2018 15:00 ]
Заголовок сообщения:  Re: Задача: симметричны ли точки на плоскости

А подразумевается ли помимо вертикали и горизонтали диагональ?
Или "углы" менее 45 градусов?

Автор:  F-MAP [ Чт июн 14, 2018 20:56 ]
Заголовок сообщения:  Re: Задача: симметричны ли точки на плоскости

Hishnik писал(а):
А есть вариант, когда не используется плавающая точка?

Код:
\ на SPF  Фигура если не огромная
\ исходные координаты структура
0
CELL -- x1
CELL -- y1
CELL -- x2
CELL -- y2
CELL -- x3
CELL -- y3
CELL -- x4
CELL -- y4
CREATE krd ALLOT


: ЗаполнитьИсходные  ( x1 y1 x2 y2  x3 y3 x4 y4 -- )
SWAP krd x4 2!
SWAP krd x3 2!
SWAP krd x2 2!
SWAP krd x1 2!
;

: ПеретресемПоУглам
3 0 DO
  4 I 1+ DO
J 2 CELLS * krd + @
I 2 CELLS * krd + @ < IF
J 2 CELLS * krd + 2@
I 2 CELLS * krd + 2@ J 2 CELLS * krd + 2!
I 2 CELLS * krd + 2!
                      THEN
         LOOP
    LOOP
krd y1 @  krd y2 @ > IF
krd y1 2@ krd y2 2@  krd y1 2! krd y2 2!
                     THEN
krd y4 @  krd y3 @ > IF
krd y4 2@ krd y3 2@  krd y4 2! krd y3 2!
                     THEN
;

: Диагональ1
krd x1 @  krd x3 @ - DUP *
krd y1 @  krd y3 @ - DUP * +
;

: Диагональ2
krd x2 @  krd x4 @ - DUP *
krd y2 @  krd y4 @ - DUP * +
;



: ЕстьСиметричная? ( x1 y1 x2 y2 x3 y3 x4 y4 -- f )
ЗаполнитьИсходные
ПеретресемПоУглам
Диагональ1
Диагональ2 =
;

Страница 1 из 1 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/