File: circlemontage.cpp

package info (click to toggle)
photoprint 0.3.8b-2
  • links: PTS
  • area: main
  • in suites: lenny
  • size: 4,396 kB
  • ctags: 3,472
  • sloc: cpp: 25,818; sh: 9,132; ansic: 4,778; makefile: 491; sed: 16
file content (111 lines) | stat: -rw-r--r-- 2,227 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <iostream>
#include <math.h>

#include "circlemontage.h"

using namespace std;

CMSegment::CMSegment(int x,int y,int w,int h,int xo,int yo,CircleMontage *cm,int t1,int t2)
	: LayoutRectangle(x,y,w,h), overlap(cm->overlap), radius(cm->radius), innerradius(cm->innerradius),
	xo(xo), yo(yo), t1(t1), t2(t2)
{
}


CMSegment::~CMSegment()
{
}


void CircleMontage::SetSegments(int segments,int angleoffset,int overlappercent)
{
	this->segments=segments;
	segmentarc=360.0/segments;
	overlap=(segmentarc*overlappercent)/100.0;
	this->angleoffset=int(angleoffset-segmentarc);
}


CMSegment *CircleMontage::GetSegmentExtent(int segment)
{
	float degperrad=360.0/(2*M_PI);
	float t1=angleoffset+segment*segmentarc-overlap;
	float t2=angleoffset+(segment+1)*segmentarc+overlap;
	if(t2>=360.0)
	{
		t1-=360.0;
		t2-=360.0;
	}
	float tx1=radius*sin(t1/degperrad);
	float ty1=-radius*cos(t1/degperrad);
//	float tx2=radius2*sin(t1/degperrad);
//	float ty2=-radius2*cos(t1/degperrad);
	float tx2=0.0;
	float ty2=0.0;
	float tx3=radius*sin(t2/degperrad);
	float ty3=-radius*cos(t2/degperrad);
//	float tx4=radius2*sin(t2/degperrad);
//	float ty4=-radius2*cos(t2/degperrad);
	float tx4=0.0;
	float ty4=0.0;

	float x1,x2,y1,y2;
	x1=tx1;
	if(tx2<x1) x1=tx2;
	if(tx3<x1) x1=tx3;
	if(tx4<x1) x1=tx4;

	y1=ty1;
	if(ty2<y1) y1=ty2;
	if(ty3<y1) y1=ty3;
	if(ty4<y1) y1=ty4;

	x2=tx1;
	if(tx2>x2) x2=tx2;
	if(tx3>x2) x2=tx3;
	if(tx4>x2) x2=tx4;

	y2=ty1;
	if(ty2>y2) y2=ty2;
	if(ty3>y2) y2=ty3;
	if(ty4>y2) y2=ty4;

	if(t1<0.0 && t2>0.0)
		y1=-radius;
	if(t1<90.0 && t2>90.0)
		x2=radius;
	if(t1<-270.0 && t2>-270.0)
		x2=radius;
	if(t1<180.0 && t2>180.0)
		y2=radius;
	if(t1<-180.0 && t2>-180.0)
		y2=radius;
	if(t1<270.0 && t2>270.0)
		x1=-radius;
	if(t1<-90.0 && t2>-90.0)
		x1=-radius;

	return(new CMSegment(int(xorigin+x1),int(yorigin+y1),int(x2-x1),int(y2-y1),
		int(-x1),int(-y1),this,int(t1),int(t2)));
}


CircleMontage::~CircleMontage()
{
}


CircleMontage::CircleMontage(int width,int height)
	: width(width), height(height), xorigin(width/2), yorigin(height/2), innerradius(0)
{
	radius=width/2;
	if((height/2)<radius)
		radius=height/2;
	SetSegments(2,0,33);
}


void CircleMontage::SetInnerRadius(int ir)
{
	innerradius=ir;
}