-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathknn.cpp
127 lines (114 loc) · 3.03 KB
/
knn.cpp
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
122
123
124
125
126
127
/*
* knn.cpp
*
* Created on: Sep 9, 2010
* Author: bluebot
*/
#include "chess.h"
vector<_cloud_t> piece;
_cloud_t chessboard[64];
_point_t chessboard_original[64];
// --------------------------------------------------------------------------------------------
// Chessboard KNN stuff
// knn: juggad version of knn routine, adds point to a chessboard square
void chessboard_add_point(float x, float y, float z) {
_point_t p(x, y, z);
uint i = 0;
for(i = 0; i < 64; i++) {
if(chessboard[i].near_pointcloud(p, 0.055/2.0)) {
//if(p.distance(chessboard[i].mean) < 0.045) {
//if(crafty_board_state[i] == 0) continue;
chessboard[i].add_point(p, len_max);
return;
}
}
// Otherwise it is a random piece
// Find if we know that piece
for(i = 0; i < piece.size(); i++) {
if(piece[i].distance_to(p) < 0.05) {
piece[i].add_point(p, len_max);
return;
}
}
// If there is no random piece we know of
_cloud_t c;
c.set_mean(p, 0);
piece.push_back(c);
}
void chessboard_evaluate() {
for(uint i = 0; i < 64; i++) {
chessboard[i].find_orientation();
}
for(uint i = 0; i < piece.size(); i++) {
piece[i].find_orientation();
}
}
void chessboard_clear() {
for(uint i = 0; i < 64; i++) {
chessboard[i].reset();
}
for(uint i = 0; i < piece.size(); i++) {
piece[i].reset();
}
piece.clear();
}
void chessboard_drawboard() {
glPushMatrix();
glColor3f(0.1f, 0.1f, 0.1f);
for(uint i = 0; i < 63; i++) {
if((i+1) % 8 != 0) {
glBegin(GL_LINES);
glVertex3f(chessboard_original[i].z, chessboard_original[i].x, chessboard_original[i].y);
glVertex3f(chessboard_original[i+1].z, chessboard_original[i+1].x, chessboard_original[i+1].y);
glEnd();
}
if (i < 56) {
glBegin( GL_LINES);
glVertex3f(chessboard_original[i].z, chessboard_original[i].x, chessboard_original[i].y);
glVertex3f(chessboard_original[i + 8].z, chessboard_original[i + 8].x, chessboard_original[i + 8].y);
glEnd();
}
}
glPopMatrix();
}
void cloud_draw_chessboard_means() {
glPushMatrix();
glColor3f(1.0f, 1.0f, 1.0f);
for(uint i = 0; i < 64; i++) {
if(chessboard[i].weight() < 5) continue;
cloud_markpoint(chessboard[i].mean);
}
glPopMatrix();
}
void cloud_draw_piece_means() {
glPushMatrix();
glColor3f(1.0f, 1.0f, 1.0f);
for(uint i = 0; i < piece.size(); i++) {
if(piece[i].weight() < 5) continue;
cloud_markpoint(piece[i].mean);
}
glPopMatrix();
}
void cloud_findorientation_and_draw() {
glPushMatrix();
glBegin(GL_POINTS);
glColor3f(1.0f, 0.0f, 0.0f);
for(uint i = 0; i < piece.size(); i++) {
if(piece[i].weight() < 25) continue;
piece[i].find_orientation();
if(piece[i].angle() == 0.0f) continue;
for(uint j = 0; j < piece[i].cloud.size(); j++) {
cloud_drawpoint(piece[i].cloud[j]);
}
}
glEnd();
glPopMatrix();
}
void cloud_pout() {
uint i = 0;
for(uint i = 0; i < piece.size() && piece[i].weight() > 5; i++) {
printf("Point %.2f, %.2f, %.2f with weight %d and orientation %lf\n",
piece[i].mean.x, piece[i].mean.y, piece[i].mean.z, piece[i].weight(), piece[i].angle());
}
printf("Cloud size is %d\n", i);
}