Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.04.2009, 17:42   #1
gluik
 
Регистрация: 02.04.2008
Сообщений: 4
По умолчанию поворот на плоскости

Программа запрашивает ввод точек и строит по ним сплайн, так же необходимо реализовать поворот,сдвиг масштабирование сплайна.

Программа работает нормально,но при повороте кривая(например параболла) искажается, не пойму с чем это связанно.
Если кривая - прямая (точки (1,1),(2,2),(3,3) и т.д. ), то поворачивает нормально.
вот код:

файл clspline.h cодержит текст взятый от сюда : http://ru.wikipedia.org/wiki/Кубический_сплайн
Код:
#include <stdlib.h>
#include <math.h>
#include <limits.h>
#include <graphics.h>
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
#include "clspline.h"

void sort(double *x,double *y,int l,int r)
{
 int i,j;
 double buffx,buffy;
 double sr =x[(l+r)/2];
 i=l;j=r;

 do
 {
   while(x[i]<sr) i++;
   while(x[j]>sr) j--;

  if(i<=j)
  {

   buffx=x[i]; buffy=y[i];
   x[i]=x[j]; y[i]=y[j];
   x[j]=buffx; y[j]=buffy;
   i++;j--;
  }
 }while(i<=j);

 if(i<r)
   sort(x,y,i,r);
 if(j>l)
   sort(x,y,l,j);
}
//поиск минимума или максимума
int search(double *x,int n,int flag)
{
 int res=0;
 for(int i=0;i<n;i++)
  if(flag)
   res=(x[res]>x[i])?res:i;
  else
   res=(x[res]<x[i])?res:i;
 return res;
}

int round (double x)
{
 double fx=fabs(x);
 int flag=floor(fx);
 if((fx-(double)flag)>0.5)
 {
  if (x>0) return ceil(x);
  else return floor(x);
 }
 else
 {
  if(x>0) return floor(x);
  else return ceil(x);
 }
}
int find(double a[],int n)
{
 for(int i=0;i<n;i++)
  if (a[n]==a[i]) return 1;
 return 0;
}
//===========

void drawspline(double *x,double *y,int n,cubic_spline &my)
{

  double dx=fabs(x[0]-x[n-1]);
  double dy=fabs(y[search(y,n,1)]-y[search(y,n,0)]);
  //система координат
  int x0=119,y0=39;      //начальные координаты экрана
  int xk=519,yk=439;    //конечные координаты экрана
  int xc=319, yc=239; //центр
  //масштаб
  double mx=dx/(xk-x0);
  double mY=dy/(y0-yk);
  double hx=mx/(n*n);
  double scale=0.5;
  int xe,ye;
  double xt=x[0];
  double yt;
  int px,py;
  int r=2;
  int sx=0;
  int sy=0;
  double phi=0.52360;
  double ax,ay;
  double angle=0;
  char ch;
  int getchar=1;
  //вывод сплайна
  while (ch!=27)
  {
   if (getchar)
   {
    clearviewport();
    setcolor(63);
    rectangle(x0,y0,xk,yk);
    xt=x[0];
    line(xc,y0,xc,yk); //oсь Y
    line(x0,yc,xk,yc); //oсь X
    setcolor(11);

    for(int i=0;i<n;i++)
    {
     ax=x[i]*cos(angle)-y[i]*sin(angle);
     ay=y[i]*cos(angle)+x[i]*sin(angle);
     px=round(ax/(mx*n*scale));
     py=round(ay/(mY*n*scale));
     px+=xc+sx;
     py+=sy+yc;
     if (px>(x0+r+1) && px<(xk-r-1))
      if (py>(y0+r+1) && py<(yk-1-r))
       circle(px,py,r);
    }
    setcolor(2);
    while (xt<x[n-1])
    {
     yt=my.f(xt);
     ax=xt*cos(angle)-yt*sin(angle);
     ay=yt*cos(angle)+xt*sin(angle);
     xe=round(ax/(mx*n*scale));
     ye=round(ay/(mY*n*scale));
     xe+=xc+sx;
     ye+=yc+sy;
     if(xe>(x0+1) && xe<(xk-1))
      if(ye>(y0+1) && ye<(yk-1))
       putpixel(xe,ye,50);
     xt=xt+hx;
    }
    getchar=0;
   }
   ch=getch();
   if (ch==0) ch=getch();
    switch(ch)
    {
    //движение
     case 72: if ( round(yc+sy-10+y[search(y,n,0)]/(mY*n/2))>(y0+21)){ sy-=10; getchar=1;} break;
     case 80: if ( round(yc+sy+10+y[search(y,n,1)]/(mY*n/2))<(yk-21)){ sy+=10; getchar=1;} break;
     case 75: if ( round(xc+sx-10+x[0]/(mx*n*scale))>(x0+11)){ sx-=10; getchar=1;} break;
     case 77: if ( round(xc+sx+10+x[n-1]/(mx*n*scale))<(xk-11)){ sx+=10; getchar=1;} break;
     //масштаб
     case 45: if (scale<4) {scale*=2; getchar=1;} break;
     case 61: if (scale>0.125) {scale/=2; getchar=1;} break;
     case 32: angle+=phi;getchar=1; break;
    }
  }
}
//===========
int main()
{
  clrscr();
  //Ввод данных
  int n=0,i=0;
  cout << "Введите кол-во точек:" ;
  cin >> n;
  double *x= new double [n];
  double *y= new double [n];

  int flag=0;
  int nn=0;
  for(i=0;i<n;i++)
  {
   flag=0;
   do
   {
    cout << "Введите координаты точки М" <<i << ": ";
    cin >> x[i] >> y[i];
    flag=find(x,nn);
    if(flag) cout << "\nНельзя вводить однородные координаты!\n";
   }while(flag);
   nn++;
  };
  sort(x,y,0,n-1);

 // for(i=0;i<n;i++) cout <<"\n" << x[i] << "\t" << y[i];
  cubic_spline my;
  my.build_spline(x,y,n);


  //установка графического режима
  int gdriver = DETECT, gmode, errorcode;

  initgraph(&gdriver, &gmode, "");
  errorcode = graphresult();

  if (errorcode != grOk)
  {
   printf("Graphics error: %s\n", grapherrormsg(errorcode));
   printf("Press any key to halt:");
  }
  else
  drawspline(x,y,n,my);
  getch();
  delete [] x;
  delete [] y;
  closegraph();

  return 0;
}
gluik вне форума Ответить с цитированием
Старый 09.04.2009, 19:23   #2
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Вы сами разбираетесь в том, что написано??? Или вы просите разобрать готовый код с Википедии?

Если второе, то сразу скажу - тема закроется без единого ответа.
MaTBeu вне форума Ответить с цитированием
Старый 10.04.2009, 09:26   #3
gluik
 
Регистрация: 02.04.2008
Сообщений: 4
По умолчанию

этот код я написал сам и указал, что текст файла clspline.h, который подключается к этому(#include "clspline.h"), взят из википедии.
gluik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с формулами - треугольник, отрезок на плоскости DjDizzy Помощь студентам 5 01.10.2008 17:52
Уравнение плоскости eoln Помощь студентам 5 27.09.2008 09:22
на координатной плоскости, координаты в ручную Proskurin Помощь студентам 5 18.04.2008 13:31
Написать класс - прямые на плоскости. Red Devel Помощь студентам 7 22.01.2008 15:23