File: bmClusterSegments.c

package info (click to toggle)
ted 2.16-5
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 13,944 kB
  • ctags: 20,273
  • sloc: ansic: 167,980; makefile: 12,518; sh: 263
file content (126 lines) | stat: -rw-r--r-- 3,194 bytes parent folder | download | duplicates (2)
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
/************************************************************************/
/*									*/
/*  Cluster line segments.						*/
/*									*/
/************************************************************************/

# include <appDebugon.h>

# if 0

================================================================
Find the line that minimises the sum of squared distances of the
end points of two segments to itself.
================================================================

We have two line segments:

    R: (r_x1,r_y1) -> (r_x2,r_y2)
    S: (s_x1,s_y1) -> (s_x2,s_y2)

Distance to a line with normal formula sin( a )*x+ cos( a )*y+ c= 0 of
each of the four end points. Where q is the angle of the line with the 
x axis.

    d= sin( q )* r_x1+ cos( q )* r_y1+ c. Etc

Squares of the distances are:

    ( sin( q )* r_x1+ cos( q )* r_y1+ c )^2. Etc

Sum of the squared distances is: ...

    T_a_a= r_x1*r_x1+ r_x2*r_x2+ s_x1*s_x1+ s_x2*s_x2;
    T_a_b= r_x1*r_y1+ r_x2*r_y2+ s_x1*s_y1+ s_x2*s_y2;
    T_a_c= r_x1     + r_x2     + s_x1     + s_x2;
    T_b_b= r_y1*r_y1+ r_y2*r_y2+ s_y1*s_y1+ s_y2*s_y2;
    T_b_c= r_y1     + r_y2     + s_y1     + s_y2;
    T_c_c= 4;

    DS=	T_a_a*		sin( q )* sin( q )+
	2* T_a_b*	sin( q )* cos( q )+
	2* T_a_c*	sin( q )* c+
	T_b_b*		cos( q )* cos( q )+
	2* T_b_c*	cos( q )* c+
	T_c_c*		c* c;

    Should be minimal. Partial derivatives to q,c respectively.

    to q:	T_a_a*		[  sin( q )*  cos( q )+  cos( q )* sin( q ) ]+
		2* T_a_b* 	[  sin( q )* -sin( q )+  cos( q )* cos( q ) ]+
		2* T_a_c*	[  cos( q )* c ]+
		T_b_b*		[  cos( q )* -sin( q )+ -sin( q )* cos( q ) ]+
		2* T_b_c*	[ -sin( q )* c ]+
		T_c_c*		0.
		= 0

    to c:	cos( q )- sin( q )+ 2* c.
		= 0;

    or		T_a_a* [ sin( q )* cos( q ) ]+
		T_a_b* [ cos^2( q )- sin^2( q ) ]+
		T_a_c* [ c* cos( q ) ]+
		T_b_b* [ cos( q )* -sin( q ) ]+
		T_b_c* [ c* -sin( q ) ]
		= 0

===

To avoid gonio use the line a* x+ b* y+ c= 0 with a+ b= 1. In stead of
a*a+ b*b= 1.

    d= a* r_x1+ ( 1- a )* r_y1+ c. Etc
    d= a* r_x1+ r_y1- a* r_y1+ c. Etc
    d= ( r_x1- r_y1 )* a+ r_y1+ c. Etc

Squares:

    d*d=	( r_x1- r_y1 )^2* a*a+
		2*( r_x1- r_y1 )* r_y1* a+
		2*( r_x1- r_y1 )* a* c+
		r_y1* r_y1= 
		2* r_y1* c+
		c* c;

    Be		V_a_a= sum( ( r_x1- r_y1 )^2 )
		V_a= sum( ( r_x1- r_y1 )* r_y1 );
		V_a_c= sum( ( r_x1- r_y1 ) );
		V_c= r_y1;
		V_c_c= 4;

Sum of the squared distances is: ...

    DS=		V_a_a*		a*a+
		2* V_a*		a+
		2* V_a_c*	a*c+
		2* V_c*		c+
		V_c_c*		c* c;

    Should be minimal. Partial derivatives to a,c respectively.

    to a:	2* V_a_a* a+ 2* V_a+ 2* V_a_c* c,
    to c:	2* V_a_c* a+ 2* V_c+ 2* V_c_c* c,

    Divide by 2, should be 0.

    (a.1)	V_a_a* a+ V_a_c* c+ V_a= 0.
    (c.1)	V_a_c* a+ V_c_c* c+ V_c= 0.

    (a.2)	V_a_c* a+
		( V_a_c^2 )/V_a_a* c+
		( V_a* V_a_c )/V_a_a= 0

    (c.2)	( V_a_c^2 )/V_c_c* a+
		V_a_c* c+ 
		( V_a_c* V_c )/ V_c_c= 0;

    (a.2-c.1)	[ ( V_a_c^2 )/V_a_a- V_c_c ]* c+
		[ ( V_a* V_a_c )/V_a_a- V_c ]= 0.

    (c.2-a.1)	[ ( V_a_c^2 )/V_c_c- V_a_a ]* a+
		[ ( V_a_c* V_c )/V_c_c- V_a ]= 0.

    a= [ V_a- ( V_a_c* V_c )/V_c_c ]/ [ ( V_a_c^2 )/V_c_c- V_a_a ].
    c= [ V_c- ( V_a* V_a_c )/V_a_a ]/ [ ( V_a_c^2 )/V_a_a- V_c_c ].

# endif