Тема: Странное.
Показать сообщение отдельно
Старый 04.09.2011, 03:09   #10
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Странное.

Сочинил нечетко чоткий пик отрезка.



void Draw_Control_Tool(double size){
//нахождение центра выделенных точек.
Vector center=Center_Positioner();
double xc,yc,zc;
xc=center.x;
yc=center.y;
zc=center.z;
double xCam=xEntityX(Camera,1);
double yCam=xEntityY(Camera,1);
double zCam=xEntityZ(Camera,1);
double dist=sqrt((xc-xCam)*(xc-xCam)+(yc-yCam)*(yc-yCam)+(zc-zCam)*(zc-zCam));
size=0.04*dist*size;
//базовая точка
xCameraProject(Camera,xc,yc,zc);
int x0=xProjectedX();
int y0=xProjectedY();

//ось икс
xCameraProject(Camera,xc+size,yc,zc);
int xOx=xProjectedX();
int yOx=xProjectedY();
xColor(255,0,0);
xLine(x0,y0,xOx,yOx);
//ось игрек
xCameraProject(Camera,xc,yc+size,zc);
int xOy=xProjectedX();
int yOy=xProjectedY();
xColor(0,255,0);
xLine(x0,y0,xOy,yOy);
//ось зед
xCameraProject(Camera,xc,yc,zc+size);
int xOz=xProjectedX();
int yOz=xProjectedY();
xColor(0,0,255);
xLine(x0,y0,xOz,yOz);

int mouseX=xMouseX();
int mouseY=xMouseY();
xColor(127,127,127);
xLine(x0,y0,mouseX,mouseY);
// пугающий меня код анализирующий возможное взаимодествие мыши и объекта
// определение совпадения одной из рисуемых осей с позицией мыши.
bool pOx=0;
bool pOy=0;
bool pOz=0;
/* у меня есть две точки для каждой из прямой, значит я могу проверить принадлежит ли третья точка любой из этих прямых.
условие что три точки лежат на одной прямой (x2-x1)*(y3-y1)-(x3-x1)*(y2-y1)=0
также пусть в радиусе 5 пикселей от точки центра столкновение не учитывается и после конца стрелки
не учитывается также
*/

// проверка принадлежности точки мыши отрезку

double cccx=(xOx-x0)*(mouseY-y0)-(mouseX-x0)*(yOx-y0);
double cccy=(xOy-x0)*(mouseY-y0)-(mouseX-x0)*(yOy-y0);
double cccz=(xOz-x0)*(mouseY-y0)-(mouseX-x0)*(yOz-y0);

double range=1000;
double lll=sqrt((x0-mouseX)*(x0-mouseX)+(y0-mouseY)*(y0-mouseY));
if (cccx<=range && cccx>=-range && ((xOx-x0)*(mouseX-x0))>0 && ((yOx-y0)*(mouseY-y0))>0){
//проверка того, что точка не ближе 5 пикселей к базовой и не дальше (xOx;yOx)
double llx=sqrt((x0-xOx)*(x0-xOx)+(y0-yOx)*(y0-yOx));
if(lll>5 && lll<=llx) {/*если пересеклось то*/ pOx=1;}}

if (cccy<=range && cccy>=-range && ((xOy-x0)*(mouseX-x0))>0 && ((yOy-y0)*(mouseY-y0))>0){
//проверка того, что точка не ближе 5 пикселей к базовой и не дальше (xOx;yOx)
double lly=sqrt((x0-xOy)*(x0-xOy)+(y0-yOy)*(y0-yOy));
if(lll>5 && lll<=lly) {/*если пересеклось то*/ pOy=1;}}

if (cccz<=range && cccz>=-range && ((xOz-x0)*(mouseX-x0))>0 && ((yOz-y0)*(mouseY-y0))>0){
//проверка того, что точка не ближе 5 пикселей к базовой и не дальше (xOx;yOx)
double llz=sqrt((x0-xOz)*(x0-xOz)+(y0-yOz)*(y0-yOz));
if(lll>5 && lll<=llz) {/*если пересеклось то*/ pOz=1;}}


xColor(255,0,0);
char console[256];
if (pOx) {
sprintf(console, "Ox is picked");
xText (100, 230, console);
}
if (pOy) {
sprintf(console, "Oy is picked");
xText (100, 240, console);
}
if (pOz) {
sprintf(console, "Oz is picked");
xText (100, 250, console);
}
xColor(255,255,255);

}

Последний раз редактировалось dsd, 23.10.2011 в 22:18.
(Offline)
 
Ответить с цитированием