* Copyright 2007, Haiku Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* Stephan Aßmus <superstippi@gmx.de>
*/
#include "Polygon.h"
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
Polygon::Polygon(BRect bounds, int32 vertices)
: fPoints(vertices),
fBounds(bounds)
{
float min = bounds.Width() / 64000.0;
float max = bounds.Width() / 320.0;
for (int32 i = 0; i < vertices; i++) {
point_vector* pv = new point_vector;
pv->point.x = bounds.left + fmod(lrand48(), bounds.Width());
pv->point.y = bounds.top + fmod(lrand48(), bounds.Height());
pv->vector.x = min + fmod(lrand48(), max - min);
pv->vector.y = min + fmod(lrand48(), max - min);
fPoints.AddItem((void*)pv);
}
}
Polygon::Polygon(BRect bounds, BList points)
: fPoints(points.CountItems()),
fBounds(bounds)
{
fPoints = points;
}
Polygon::~Polygon()
{
while (point_vector* pv = (point_vector*)fPoints.RemoveItem((int32)0))
delete pv;
}
Polygon*
Polygon::Step() const
{
BList points(CountPoints());
for (int32 i = 0; point_vector *pv = (point_vector*)fPoints.ItemAt(i); i++) {
point_vector* npv = new point_vector;
BPoint p = pv->point + pv->vector;
if (p.x < fBounds.left || p.x > fBounds.right)
npv->vector.x = -pv->vector.x;
else
npv->vector.x = pv->vector.x;
if (p.y < fBounds.top || p.y > fBounds.bottom)
npv->vector.y = -pv->vector.y;
else
npv->vector.y = pv->vector.y;
npv->point = pv->point + npv->vector;
points.AddItem((void*)npv);
}
return new Polygon(fBounds, points);
}
uint32
Polygon::CountPoints() const
{
return fPoints.CountItems();
}
BPoint
Polygon::PointAt(int32 index) const
{
BPoint p;
if (point_vector* pv = (point_vector*)fPoints.ItemAt(index))
p = pv->point;
return p;
}