-
Notifications
You must be signed in to change notification settings - Fork 1
/
DrawCircle.java
121 lines (97 loc) · 2.87 KB
/
DrawCircle.java
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
112
113
114
115
116
117
118
119
120
121
class DrawCircle extends DrawObject
{
float r;
DrawCircle(GraficPanel p, PointF sp)
{
super(p, Tool.DRAW_CIRCLE, sp);
}
DrawCircle(GraficPanel p, ObjectInputStream ois) throws IOException
{
super(p, Tool.DRAW_CIRCLE, ois);
r = distPoint(pn1, pn3);
}
public void setEnd(PointF e)
{
normPoint(pn3, e);
r = distPoint(pn1, pn3);
}
@Override
public void draw(Canvas canvas)
{
float hs = panel.hs;
float p1x = pixel_x(pn1.x);
float p1y = pixel_y(pn1.y);
float p3x = pixel_x(pn3.x);
float p3y = pixel_y(pn3.y);
float sr = r * panel.gfx;
if(Math.abs(sr) > hs){ // object
canvas.drawCircle(p1x, p1y, sr, panel.conPaint);
}
else{ // representation
canvas.drawLine(p1x-hs, p1y-hs, p1x+hs, p1y+hs, panel.conPaint); // cross
canvas.drawLine(p1x-hs, p1y+hs, p1x+hs, p1y-hs, panel.conPaint);
canvas.drawCircle(p1x, p1y, hs/2, panel.conPaint); // circle
}
if((flags & Flags.SELECTED) != 0){ // handles
canvas.drawLine(p1x, p1y-panel.CESI, p1x, p1y+panel.CESI, panel.conPaint); // center
canvas.drawLine(p1x-panel.CESI, p1y, p1x+panel.CESI, p1y, panel.conPaint);
canvas.drawRect(p3x-hs, p3y-hs, p3x+hs, p3y+hs, panel.conPaint); // radius
}
}
@Override
public float touchDist(PointF p)
{
float dist = Float.MAX_VALUE;
if(p.x<Math.max(pn1.x-r, pn1.x+r)+panel.gbo && p.x>Math.min(pn1.x-r, pn1.x+r)-panel.gbo &&
p.y<Math.max(pn1.y-r, pn1.y+r)+panel.gbo && p.y>Math.min(pn1.y-r, pn1.y+r)-panel.gbo){
float dc = Float.MAX_VALUE;
if((flags & Flags.SELECTED) != 0)
dc = distPoint(pn1, p);
float d = Math.abs(distPoint(pn1, p) - r);
d = Math.min(d, dc);
if(d < panel.gbo)
dist = d;
}
return dist;
}
@Override
public void changeInitMove(PointF p)
{
pn1o.set(pn1); // save orignal po1 and po3 point
pn3o.set(pn3);
float dc = distPoint(pn1, p); // calc distance to center handle
float dr = distPoint(pn3, p); // radius
boolean mo = panel.sideBar.pointerMoveO(); // get move flags
boolean mh = panel.sideBar.pointerMoveH();
flags &= ~Flags.CHANGEMASK; // reset and set move flags
float g = panel.gbo;
if(mo || (!mh && dc<g) || (!mh && dc>g && dr>g) || (!mh && dc<g && dr<g))
flags |= dc<g ? Flags.MOVEOBJECT | Flags.HA_CENTER : Flags.MOVEOBJECT;
else if(dr < g)
flags |= Flags.MOVEHANDLE | Flags.HA_RADIUS;
}
@Override
public void changeObjectMove(PointF drag)
{
if((flags & Flags.MOVEOBJECT) != 0){
moveObject(pn1, pn3, pn1o, drag);
}
else if((flags & Flags.MOVEHANDLE) != 0){
moveHandle(pn3, pn3o, drag);
r = distPoint(pn1, pn3);
}
}
@Override
public void changeInitRotate(PointF center)
{
}
@Override
public void changeObjectRotate(float angle)
{
}
@Override
public void writePars(ObjectOutputStream oos) throws IOException
{
writeParsC(oos);
}
}