xref: /haiku/src/add-ons/screen_savers/spider/Polygon.cpp (revision 220d04022750f40f8bac8f01fa551211e28d04f2)
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((int32)0))
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