1 /* 2 * Copyright 2007, Haiku Inc. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Stephan Aßmus <superstippi@gmx.de> 7 */ 8 #include "Polygon.h" 9 10 #include <math.h> 11 #include <stdio.h> 12 #include <stdlib.h> 13 14 // constructor 15 Polygon::Polygon(BRect bounds, int32 vertices) 16 : fPoints(vertices), 17 fBounds(bounds) 18 { 19 float min = bounds.Width() / 64000.0; 20 float max = bounds.Width() / 320.0; 21 for (int32 i = 0; i < vertices; i++) { 22 point_vector* pv = new point_vector; 23 pv->point.x = bounds.left + fmod(lrand48(), bounds.Width()); 24 pv->point.y = bounds.top + fmod(lrand48(), bounds.Height()); 25 pv->vector.x = min + fmod(lrand48(), max - min); 26 pv->vector.y = min + fmod(lrand48(), max - min); 27 fPoints.AddItem((void*)pv); 28 } 29 } 30 31 // constructor 32 Polygon::Polygon(BRect bounds, BList points) 33 : fPoints(points.CountItems()), 34 fBounds(bounds) 35 { 36 fPoints = points; 37 } 38 39 // destructor 40 Polygon::~Polygon() 41 { 42 while (point_vector* pv = (point_vector*)fPoints.RemoveItem(0L)) 43 delete pv; 44 } 45 46 // Step 47 Polygon* 48 Polygon::Step() const 49 { 50 BList points(CountPoints()); 51 for (int32 i = 0; point_vector *pv = (point_vector*)fPoints.ItemAt(i); i++) { 52 point_vector* npv = new point_vector; 53 BPoint p = pv->point + pv->vector; 54 if (p.x < fBounds.left || p.x > fBounds.right) 55 npv->vector.x = -pv->vector.x; 56 else 57 npv->vector.x = pv->vector.x; 58 if (p.y < fBounds.top || p.y > fBounds.bottom) 59 npv->vector.y = -pv->vector.y; 60 else 61 npv->vector.y = pv->vector.y; 62 npv->point = pv->point + npv->vector; 63 points.AddItem((void*)npv); 64 } 65 return new Polygon(fBounds, points); 66 } 67 68 // CountPoints 69 uint32 70 Polygon::CountPoints() const 71 { 72 return fPoints.CountItems(); 73 } 74 75 // PointAt 76 BPoint 77 Polygon::PointAt(int32 index) const 78 { 79 BPoint p; 80 if (point_vector* pv = (point_vector*)fPoints.ItemAt(index)) 81 p = pv->point; 82 return p; 83 } 84