File: setStringPosition.sci

package info (click to toggle)
scilab 5.3.3-10
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 330,656 kB
file content (69 lines) | stat: -rw-r--r-- 2,478 bytes parent folder | download
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
// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
// Copyright (C) 2010 - INRIA - Serge Steer <serge.steer@inria.fr>
//
// This file must be used under the terms of the CeCILL.
// This source file is licensed as described in the file COPYING, which
// you should have received as part of this distribution.  The terms
// are also available at;
// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt

function setStringPosition(string_handle,pt)
//Computes the position of the lower left corner of the string box. 
//
//These coordinates must be expressed in user coordinates units but their
//computation takes into account the pixel dimensions of the text boxes
//when they are not located in the upper right position
  ax=string_handle.parent
  while ax.type<>"Axes" then ax=ax.parent,end

  
  r=xstringl(0,0,string_handle.text);r=r(3:4)';
  d=mark_usersize(point_handle);
  orient=string_handle.user_data;
  if orient==0 then //automatic
    if ax.zoom_box==[] then
      t=[pt(1:2)+r-ax.data_bounds(2,1:2)<0; //a l'interieur des max
         pt(1:2)-r-ax.data_bounds(1,1:2)>0] //a l'interieur des min
    else
      t=[pt(1:2)+r-ax.zoom_box([3 4])<0; //a l'interieur des max
         pt(1:2)-r-ax.zoom_box([1 2])>0] //a l'interieur des min
    end
    if and(t(1,:)) then //les deux sont inf aux max (upper right)
      orient=2;//1
    elseif and(t(2,:)) //les deux sont sup aux min (lower left)
      orient=3;//2
    elseif t(1,1)&t(2,2) //x est sup au min y est inf au max (upper left)
      orient=1;//3
    else//if t(1,2)*t(2,1) //y est sup au min   et x est inf au max (lower right)
      orient=4;
    end
  end
  select orient
  case 1 then //upper left
    dx=(-d(1)-r(1));dy=d(2);
  case 2 then //upper right
    dx=d(1);dy=d(2)
  case 3 then //lower left
    dx=-d(1)-r(1);dy=-d(2)-r(2)
  case 4 then //lower right
    dx=d(1);dy=-d(2)-r(2)
  end
  
  if ax.view=="3d" then
    angles=ax.rotation_angles*%pi/180;
    t=angles(2);a=angles(1);
    st=sin(t);ct=cos(t);sa=sin(a);ca=cos(a)
    //apply inverse transformation matrix to [dx,dy,0]
    //the transformation matrix is R=[-st ct 0;-ct*ca -st*sa sa;ct*sa st*sa ca] 
    //and the inserve is R'
    pos=pt+[-st*dx-ct*ca*dy,ct*dx-st*ca*dy,sa*dy]
  else
    pos=pt+[dx dy]
  end
  string_handle.data=pos
endfunction
function usize=mark_usersize(m)
  pix_size=10*(m.mark_size+1)
  [x1,y1]=xchange([0 pix_size],[0 pix_size],'i2f');
  usize=abs([x1(2)-x1(1) y1(2)-y1(1)])/20;
endfunction