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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.08.2010, 17:44   #1
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию поворот точки вокруг оси

Здравствуйте. Хочу сделать простой поворот точки (аля спидометр итд). Вроде бы формула верная, а рисует непонятно что ( если приглядеться то рисуется спираль =) ). Еще мне интересно как сделать чтобы положение линии обновлялось, а не рисовалась копия. Думал надо как-то очищать канвас, но такой функции не нашел. В общем я первый раз пытаюсь что-то рисовать в билдере и вот, что у меня вышло:

Код:
#include <vcl.h>
#pragma hdrstop

#include "Indicator.h"
#include <math.h>

#define PI 3.14159265

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
Tind *ind;

struct LPoint {
	int x,y;
};

LPoint axis, rP;

//---------------------------------------------------------------------------
__fastcall Tind::Tind(TComponent* Owner)
	: TForm(Owner)
{
	 int center_h = ind->ClientHeight/2, center_w = ind->ClientWidth/2;
	 axis.x = center_h;
	 axis.y = center_w;
	 rP.x = center_h;
	 rP.y = center_w - 100;

	 Canvas->MoveTo(axis.x, axis.y);
	 Canvas->LineTo(rP.x, rP.y);
}

// поворот точки вокруг оси
void rotate(LPoint &point, LPoint axis, double phi){
	 phi *= PI/180;
	 point.x = (int) ((point.x-axis.x)*cos(phi) - (point.y-axis.y)*sin(phi));
	 point.y = (int) ((point.x-axis.x)*sin(phi) + (point.y-axis.y)*cos(phi));
}

// преобразование экранных координат
void parsePoint(LPoint &p,int SIZE,int SCALE){
			p.x = SIZE/2+SCALE*p.x;
			p.y = SIZE/2-SCALE*p.y;
}

//---------------------------------------------------------------------------
void __fastcall Tind::Timer1Timer(TObject *Sender)
{
	 static double angle = 0.0;
	 rotate(rP, axis, angle);
	 parsePoint(rP, 100, 1);
	 Canvas->MoveTo(axis.x, axis.y); // почему-то перо смещается, поэтому я тут пишу его обновление...
	 Canvas->LineTo(rP.x, rP.y);
  	 angle += 0.1;
}
NiCola999 вне форума Ответить с цитированием
Старый 12.08.2010, 19:33   #2
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

Я не понял, как Вы хотите ориентировать этот индикатор, но формула по меньшей мере странная. Вот работающий код
Код:
#include <vcl.h>
#pragma hdrstop

#include <math.h>
#define PI 3.14159265
#define LENGTH 100


#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

struct LPoint {
	int x,y;
};

LPoint axis, rP;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner) {
	int center_h = Form1->ClientHeight/2, center_w = Form1->ClientWidth/2;
	 axis.x = center_w;
	 axis.y = center_h;
	 rP.x = center_w - LENGTH;
	 rP.y = center_h;

/*
//это бесполезно, т.к. на этапе конструктора форма ещё не рисуется
	 Canvas->MoveTo(axis.x, axis.y);
	 Canvas->LineTo(rP.x, rP.y);
/*
}
//---------------------------------------------------------------------------

void rotate(LPoint &point, LPoint axis, double phi){
	 phi *= PI/180;
	 point.x = (int)(axis.x - LENGTH * cos(phi));
	 point.y = (int)(axis.y - LENGTH * sin(phi));
}

// преобразование экранных координат
void parsePoint(LPoint &p,int SIZE,int SCALE){
			p.x = SIZE/2+SCALE*p.x;
			p.y = SIZE/2-SCALE*p.y;
}

//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
	 static double angle = 0.0;
	 Canvas->Pen->Color = clBtnFace;
	 Canvas->MoveTo(axis.x, axis.y);
	 Canvas->LineTo(rP.x, rP.y);
	 rotate(rP, axis, angle);
	 //parsePoint(rP, 100, 1);
	 Canvas->Pen->Color = clBlack;
	 Canvas->MoveTo(axis.x, axis.y);
	 Canvas->LineTo(rP.x, rP.y);
	 angle += 0.1;
}
Перо смещается в LineTo
Росли вроде умными, выросли дурнями... (c)А.Васильев

Последний раз редактировалось Greblin; 12.08.2010 в 19:36.
Greblin вне форума Ответить с цитированием
Старый 12.08.2010, 20:44   #3
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

спасибо!!!

Код:
 Canvas->Pen->Color = clBtnFace
а как сделать чтобы стрелка двигалась на фоне изображения и не замещала её цветом?(прозрачная кисть мб)

Последний раз редактировалось Stilet; 13.08.2010 в 08:12.
NiCola999 вне форума Ответить с цитированием
Старый 12.08.2010, 23:16   #4
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

Можно сделать Image->Refresh, но там может появиться мерцание. Я в своё время отделался от него каким-то шаманизмом, но вроде бы на форуме были такие темы
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Старый 13.08.2010, 01:16   #5
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

да, мерцания видно...не пойдет
NiCola999 вне форума Ответить с цитированием
Старый 13.08.2010, 13:19   #6
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

ап......!!!
NiCola999 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поворот каждого обьекта вокруг своей оси. vaflea Общие вопросы C/C++ 0 01.06.2010 14:18
Тело вращается вокруг неподвижной оси Мелкая Помощь студентам 0 12.12.2009 16:40
Проблема с движением вокруг своей оси. intelx1989 Общие вопросы Delphi 3 14.05.2009 18:02
Вращение вокруг произвольно оси mens-evgenij Помощь студентам 3 21.03.2009 15:42
Mногоугольник, вращающийся вокруг заданной точки Sashka Помощь студентам 13 30.01.2008 17:15