LINUX.ORG.RU

[lisp] Полигон в набор линий

 


0

1

Полигон задаётся точками (x y):

points = '( (x1 y1) (x2 y2) (x3 y3) (x4 y4) )

Как бы из этого получить список составляющих полигон линий:

lines = '(   ((x1 y1) (x2 y2)) ((x2 y2) (x3 y3)) ((x3 y3) (x4 y4)) ((x4 y4) (x1 y1))   )

Может map-функциями можно как. Ничего кроме банального цикла в голову не приходит.


> Ничего кроме банального цикла в голову не приходит.

А чем плох этот вариант? Через loop должно просто получиться, через iterate возможно ещё проще, но я с ним не знаком

yoghurt ★★★★★
()

Может map-функциями можно как.

Зачем map функции, когда можно loop?

CL-USER> (loop 
	    for p on *points* by #'cdr
	      collect (list (first p)
			    (if (second p)
				(second p)
				(first *points*))))

		
(((X1 Y1) (X2 Y2)) ((X2 Y2) (X3 Y3)) ((X3 Y3) (X4 Y4)) ((X4 Y4) (X1 Y1)))

anonymous
()
(loop for x on '((x1 y1) (x2 y2) (x3 y3) (x4 y4)) by #'cdr             
   while (cdr x)
   collect (list (first x)
                 (second x)))
archimag ★★★
()
Ответ на: комментарий от yoghurt

> Вот уж действительно, there're more than one way to do it (c) :)

Пока только два. :)

k_andy ★★★
()

В моём лиспе получилось так:

points = '( (x1 y1) (x2 y2) (x3 y3) (x4 y4) )

lastLine = list( car(last(points)) car(points) )

lines = '()

foreach( e cdr(points)
	lines = append1(lines list(car(points) e))
	points = remove(car(points) points)
)

lines = append1(lines lastLine)
    (((x1 y1) (x2 y2)) ((x2 y2) (x3 y3)) ((x3 y3) (x4 y4)) ((x4 y4) (x1 y1)))
mosfet
() автор топика
Ответ на: комментарий от k_andy

Вот что-то такое мне и нужно. Спасибо!

mosfet
() автор топика

быдлокодерский вариант на быдлокодерском С без копирования данных:

#include <stdio.h>

typedef struct Point	{ int 	x , y;  } Point;
typedef struct Line	{ Point	p1, p2; } Line;

int main( void )
{
	Point  pts[] = { { 0, 0 }, { 0, 2 }, { 2, 0 }, { 1, 0 }, { 0, 0 } };
	size_t count = sizeof( pts ) / sizeof( Point ) - 1; // Да - я сознательно добавил еще одну ненужную точку
	Point* end   = pts + count;

	Point* pt = pts;	
	while( pt < end )
	{
		Line* line = pt++; // И передавайте ее куда хотите

		printf(
			"Line %d: (%d;%d) (%d;%d)\n", pt - pts,
			line->p1.x, line->p1.y,
			line->p2.x, line->p2.y );
	}
}

captcha: I've ideal

anonymous
()

я надеюсь, ты не собрался через полигоны, таким способом составленные, рисовать что-либо?

Doug
()
Ответ на: комментарий от anonymous

Ну того что есть вполне хватает. Нужно больше - есть объектный SKILL++. У всех остальных вообще tcl и ничего.

mosfet
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.