Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Вопросы начинающих программистов
Перезагрузить страницу Компьютераная графика, горячие клавиши
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Anya123 Anya123 вне форума
Member
 
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 21.10.2006
По умолчанию 05.06.2007, 16:08

никак не могу понять почему не вызываются в проге main горячие клавиши уменьшения и увеличивания. Клавиша очистки нормально работает а остальное нет.

посмотрите пожалуйста, не знаю в чём ошибка.


Код:
#include <iostream.h>
#include <windows.h>
#include <conio.h>
#include <stdio.h>
#include <math.h>

#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>

const MaxSize = 1000;

struct Point
{
    int        x;
    int        y;
};

struct EndElement
{
    int        x1;
    int        x2;
    int        n1;
    int        n2;
};

int            n;
double            A[MaxSize][MaxSize];
double            f[MaxSize];

int            Xo = 100;
int            Yo = 550;
int            Xm = 930;
int            Ym = 620;        
int            x;
int            y;

Point            Points[MaxSize];
EndElement        EndElements[MaxSize];
int            SizeOfPoints        = 0;
int            SizeOfEndElements    = 0; 

int            buttonleft  = 0;
int            buttonright = 0;
int            buttonenter = 0;

void LU_Decay()
{
    int i, j, k;
    for( i = 1; i < n; i++ )
    {
        for( j = 0; j < i; j++ )
        {
            for( k = 0; k < j; k++ )
                A[j][i] -= A[k][i] * A[j][k];
            A[j][i] = A[j][i] / A[j][j];
        }
        for( j = 1; j < i + 1; j++ )
            for( k = 0; k < j; k++ )
                A[i][j] -= A[i][k] * A[k][j];
    }
}




void Solve_L()
{
    int i, j;
    for( i = 0; i < n; i++ )
    {
        for( j = 0; j < i; j++ ) 
            f[i] -= f[j] * A[i][j];
        f[i] = f[i] / A[i][i];
    }
}
void Solve_U()
{
    int i, j;
    for( i = n - 2; i >= 0; i-- )
        for( j = i + 1; j < n; j++ ) 
            f[i] -= f[j] * A[i][j];
}
void LU_Solve()
{
    LU_Decay();
    Solve_L();
    Solve_U();
}
double Ksi(int i, double X, double h)
{
    switch ( i )
    {
        case  0: return ( 1 - 3 * X * X + 2 * X * X * X ); break;
        case  1: return ( X - 2 * X * X + X * X * X ) * h; break;
        case  2: return ( 3 * X * X - 2 * X * X * X );       break;
        case  3: return ( - X * X + X * X * X ) * h;       break;
        default: return ( 0 );                   break;
    }
}
void Spline()
{
    int        i, j, l, k;
    double    h, SA, Sf;
    n = 2 * SizeOfEndElements + 2;
    for( i = 0; i < n; i++ )
    {
        for( j = 0; j < n; j++ )
            A[i][j] = 0;
        f[i] = 0;
    }
    for( l = 0; l < SizeOfEndElements; l++ )
    {
        h = EndElements[l].x2 - EndElements[l].x1;
        for( i = 0; i < 4; i++ )
        {
            for( j = 0; j < 4; j++ )
            {
                SA = 0;
                for( k = EndElements[l].n1; k < EndElements[l].n2; k++ )
    SA += Ksi(i,(Points[k].x - EndElements[l].x1) / h, h)*Ksi(j,(Points[k].x - EndElements[l].x1) / h, h);
                A[i + 2 * l][j + 2 * l] += SA;
            }
            Sf = 0;
            for( k = EndElements[l].n1; k < EndElements[l].n2; k++ )
                Sf += Ksi(i,(Points[k].x - EndElements[l].x1) / h, h) * Points[k].y;
            f[i + 2 * l] += Sf;
        }
    }
    LU_Solve();
}

double FuncSpline(double X)
{
    int l = 0;
    for( int i = 0; i < SizeOfEndElements; i++ )
        if( (X > EndElements[i].x1) && (X < EndElements[i].x2) )
        {
            l = i;
            break;
        }
    double h;
    double q0,q1,q2,q3;
    h  = EndElements[l].x2 - EndElements[l].x1;
    X  = ( X - EndElements[l].x1 ) / h;
    q0 = Ksi(0, X, h);
    q1 = Ksi(1, X, h);
    q2 = Ksi(2, X, h);
    q3 = Ksi(3, X, h);
    return ( f[2 * l] * q0 + f[1 + 2 * l] * q1 + f[2 + 2 * l] * q2 + f[3 + 2 * l] * q3 );    
}
double KsiDif(int i, double X, double h)
{
    switch ( i )
    {
        case  0: return ( - 6 * X + 6 * X * X ); break;
        case  1: return ( 1 - 4 * X + 3 * X * X ) * h; break;
        case  2: return ( 6 * X - 6 * X * X );       break;
        case  3: return ( - 2 * X + 3 * X * X ) * h;       break;
        default: return ( 0 );                               break;
    }
}

double FuncSplineDif(double X)
{
    int l = 0;
    for( int i = 0; i < SizeOfEndElements; i++ )
        if( (X > EndElements[i].x1) && (X < EndElements[i].x2) )
        {
            l = i;
            break;
        }
    double h;
    double q0,q1,q2,q3;
    h  = EndElements[l].x2 - EndElements[l].x1;
    X  = ( X - EndElements[l].x1 ) / h;
    q0 = KsiDif(0, X, h);
    q1 = KsiDif(1, X, h);
    q2 = KsiDif(2, X, h);
    q3 = KsiDif(3, X, h);
    return ( f[2 * l] * q0 + f[1 + 2 * l] * q1 + f[2 + 2 * l] * q2 + f[3 + 2 * l] * q3 );    
}

void Sort()
{
    Point p;
    for( int i = 0; i < SizeOfPoints - 1; i++ )
        for( int j = SizeOfPoints - 1; j > i; j-- )
            if (Points[j-1].x > Points[j].x)
            {
                p = Points[j-1];
                Points[j-1]=Points[j];
                Points[j] = p;
            }
    for( i = 0; i < SizeOfEndElements; i++ )
    {
        int k = 0;
        for( int j = 0; j < SizeOfPoints; j++ )
        {
            if( (Points[j].x > EndElements[i].x1) && (Points[j].x < EndElements[i].x2) )
                k++;
        }
        EndElements[i].n2 = k;
    }
    EndElements[0].n1 = 0;
    for( i = 0; i < SizeOfEndElements - 1; i++ )
    {
        EndElements[i].n2 += EndElements[i].n1;
        EndElements[i + 1].n1 = EndElements[i].n2;
    }
    EndElements[SizeOfEndElements - 1].n2 += EndElements[SizeOfEndElements - 1].n1; 
}

int CALLBACK _x(int q)     \\программа горячих клавиш
{
    return (q - Xo);
}

int CALLBACK _y(int q)
{
    return (Yo - q);
}

int CALLBACK x_(int q)
{
    return (q + Xo);
}

int CALLBACK y_(int q)
{
    return (Yo - q);
}




void CALLBACK OnMouseLeftDown( AUX_EVENTREC* event )
{
    x = event->data[AUX_MOUSEX];
    y = event->data[AUX_MOUSEY];
    if ( (x > Xo)&&(y < Yo) && (x < 880)&&(y > 70) )
    {
        Points[SizeOfPoints].x = _x(x);
        Points[SizeOfPoints].y = _y(y);
        SizeOfPoints++;
        buttonleft  = 1;
    }
    else
        buttonleft = 0;
    buttonright = 0;
buttonenter = 1;
}
void CALLBACK OnMouseRightDown( AUX_EVENTREC* event )
{
    x = event->data[AUX_MOUSEX];
    y = event->data[AUX_MOUSEY];
    if ( (x > Xo)&&(y < Yo) && (x < 880)&&(y > 70) )
    {
        if ( SizeOfEndElements )
            EndElements[SizeOfEndElements].x1 = EndElements[SizeOfEndElements - 1].x2;
        else
            EndElements[SizeOfEndElements].x1 = 0;
        EndElements[SizeOfEndElements].x2 = _x(x);
        SizeOfEndElements++;
        buttonleft  = 0;
buttonright = 1;
buttonenter = 0;
    }
    buttonleft  = 0;
buttonright = 0;
buttonenter = 0;
}

void CALLBACK Enter()
{
    buttonleft  = 0;
    buttonright = 0;
    buttonenter = 1;
}

void CALLBACK Clear()
{
    buttonleft      = 0;
    buttonenter      = 0;
    buttonright      = 0;
    SizeOfPoints      = 0;
    SizeOfEndElements = 0;
}

void CALLBACK resize(int width, int height)
{
    glViewport(0,0,width,height);
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    glOrtho(0,width, height,0, -1,1);
    glMatrixMode( GL_MODELVIEW );
}

void CALLBACK osi()
{
    int h = 50;
    glLineWidth(1);
    glBegin( GL_LINES );
        glColor3ub(50,50,50);
        for (int i = 0; i < int( Xm / h )-1; i++)
        {
            glVertex2i(Xo+h*i,Ym);glVertex2i(Xo+h*i,20);
            glVertex2i(Xo-h*i,Ym);glVertex2i(Xo-h*i,20);
            glVertex2i(Xm,Yo+h*i);glVertex2i(20,Yo+h*i);
            glVertex2i(Xm,Yo-h*i);glVertex2i(20,Yo-h*i);
        }
    glEnd();
    glLineWidth(2);
    glBegin( GL_LINES );
        glColor3ub(255,255,255);glVertex2i(Xo,50);glVertex2i(Xo,Ym-20);glVertex2i(Xo,50);
glVertex2i(Xo+5,70);glVertex2i(Xo,50);glVertex2i(Xo-5,70);glVertex2i(50, Yo);
glVertex2i(Xm-30, Yo);glVertex2i(Xm-30, Yo);glVertex2i(Xm-50, Yo+5);
glVertex2i(Xm-30, Yo);glVertex2i(Xm-50, Yo-5);
    glEnd();
    glLineWidth(1);
}
void CALLBACK display()
{
    glClear( GL_COLOR_BUFFER_BIT );
    osi();
// Рисуем Точки     
    glColor3ub(0, 255, 0);
    glPointSize(3);
    glBegin( GL_POINTS );
    for(int i = 0; i < SizeOfPoints; i++ )
        glVertex2i(x_(Points[i].x), y_(Points[i].y));
    glEnd();
    glPointSize(1);
// Конец Рис Точки

// Рисуем КЭ     
    glColor3ub(255, 0, 0);
    glBegin( GL_LINES );
    for( i = 0; i < SizeOfEndElements; i++ )
    {
        glVertex2i(x_(EndElements[i].x2), 60);
        glVertex2i(x_(EndElements[i].x2), 590);
    }
    glEnd();
// Конец Рис КЭ
    
    if ( buttonleft )
    {
        glBegin( GL_LINES );
            glColor3ub(0, 255, 0);
            glVertex2i(x + 5, y);
            glVertex2i(x - 5, y);
            glVertex2i(x, y + 5);
            glVertex2i(x, y - 5);
        glEnd();
    }

    if ( buttonenter )
    {
        Sort();
        Spline();
        glColor3ub(0, 0, 255);
        glLineWidth(3);
        glBegin( GL_LINE_STRIP );
        int k = 0;
        for(int X = 0; X < EndElements[SizeOfEndElements - 1].x2; X++ )
        {
            if( X == EndElements[k].x2) {k++;}
            else
                glVertex2i(x_(X),y_(FuncSplineDif(X)));
        }
        glEnd();
        glColor3ub(255, 128, 64);
        glBegin( GL_LINE_STRIP );
        k = 0;
        for( X = 0; X < EndElements[SizeOfEndElements - 1].x2; X++ )
        {
            if( X == EndElements[k].x2) {k++;}
            else
                glVertex2i(x_(X),y_(FuncSpline(X)));
        }
        glEnd();
        glLineWidth(1);
    }
    auxSwapBuffers();
}

void main()
{
    auxInitPosition( 0, 0, 950, 640 );
        auxInitDisplayMode( AUX_RGB | AUX_DEPTH |AUX_DOUBLE );
        auxInitWindow( "  Spline   " );
        auxIdleFunc(display);
        auxReshapeFunc(resize);
    auxMouseFunc(AUX_LEFTBUTTON,AUX_MOUSEDOWN,OnMouseLeftDown);
    auxMouseFunc(AUX_RIGHTBUTTON,AUX_MOUSEDOWN,OnMouseRightDown);
    auxKeyFunc(VK_RETURN,Enter);
    auxKeyFunc(AUX_q,Clear); \\здесь только очистка вызывается а callback x,y, нет
    auxMainLoop(display);
}
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
горячие клавиши Кристина12 Устройства ввода 4 02.03.2013 10:36
Засекреченные «горячие» клавиши или как стать богом Windows 7 Dialog567 Windows 7 4 01.04.2011 16:18
Как отключить "горячие клавиши"? Ecbka Windows 7 9 22.01.2010 14:20
горячие комбинации с FN gad-spider Звук 4 12.10.2008 19:36
На Defender KM-9010 не работают горячие клавиши. Георгий КВ Техническая поддержка 12 25.07.2007 14:42
Каким образом можно заставить реагировать программу на горячие клавиши Nile Visual C++ 3 10.07.2007 10:43
Горячие клавиши -=Rain=- Visual Basic 1 12.10.2005 03:27
ActionManager и горячие клавиши feedbee C++ Builder 0 16.08.2005 16:09
Почему в Borland Turbo C++ 3.0 под Windows XP не работают горячие Shift-INS, Ctr-INS MTony С/С++ 1 13.06.2005 18:10
Реально ли сделать утилитку, которая бы смогла выуживать все горячие клавиши Nikton Visual C++ 4 10.01.2005 09:33
Как в VW привязать стандартные виндовые горячие клавиши kuu Smalltalk 1 04.10.2004 15:15
Как из SysTray ловить горячие кнопки Yuri M Liskov Delphi 1 05.04.2004 12:28



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов