Последние записи
- TChromium (CEF3), сохранение изображений
- Как в Delphi XE обнулить таймер?
- Изменить цвет шрифта TextBox на форме
- Ресайз PNG без потери прозрачности
- Вывод на печать графического файла
- Взаимодействие через командную строку
- Перенести программу из Delphi в Lazarus
- Определить текущую ОС
- Автоматическая смена языка (раскладки клавиатуры)
- Сравнение языков на массивах. Часть 2
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
13th
Авг
Движение обьекта на заданный угол
Posted by Chas under Delphi, Исходники
У меня есть картинка, которая должна смещаться относительно координат х и у, в зависимости от угла поворота изображения. Я сделал следующие формулы подсчета передвижения:
Car.Y:=Car.Y+Sin(DegToRad(Car.Angle ))*round(Car.speed);
Car.X:=Car.X-Cos(DegToRad(Car.Angle))*round(Car. speed);
Но при данных формулах картинка праивльно двигается только на углы +-45 градусов (0, 45, 90, 135, 180, 225, 270, 315, 360); А вот движение на промежуточные углы происходит неправильно. Как сделать правильное движение на любой угол? например на 1, 5, 15 градусов. Насколько я понимаю у меня из-за округлений могут быть неточности… или угол нужно сделать тип single?
XE5
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, Math;
type
TCar=record
Angle:integer;
Speed,Ves,Power,SpeedLimit,x,y:real;
qGo,qBack:boolean;
end;
TForm1 = class(TForm)
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Buf, CarIMG, OuthCarIMG:TBitmap;
path:string;
Car:TCar;
procedure IMGRotate(IMG:TBitmap; Angle:single);
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
path:=ExtractFileDir(Application.ExeName);
Buf:=TBitmap.Create;
Buf.Width:=640;
Buf.Height:=480;
CarIMG:=Tbitmap.Create;
CarIMG.Transparent:=true;
CarIMG.LoadFromFile(path+'\0.bmp');
OuthCarIMG:=Tbitmap.Create;
OuthCarIMG.Transparent:=true;
OuthCarIMG.LoadFromFile(path+'\0.bmp');
Car.X:=320;
Car.Y:=240;
Car.Speed:=0;
Car.qGo:=false;
Car.qBack:=false;
Car.Ves:=1.1;
Car.Power:=2.4;
Car.Angle:=0;
Car.SpeedLimit:=Car.Power-Car.Ves;
if Car.SpeedLimit<0 then Car.SpeedLimit:=0;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
buf.Canvas.Brush.Color:=clGreen;
buf.Canvas.Rectangle(0,0,640,480);
Buf.Canvas.Draw(Round(Car.X),Round(Car.Y),OuthCarIMG);
form1.Canvas.Draw(0,0,Buf);
//razgon
if (Car.qGo=true) and (Car.SpeedLimit>=(Car.Speed+Car.Power-Car.Ves) ) then
Car.Speed:=Car.Speed+(Car.Power-Car.Ves);
//zadniy hod
if (Car.qBack=true) and (Car.SpeedLimit>=-(Car.Speed-Car.Power+Car.Ves) ) then
Car.Speed:=Car.Speed-(Car.Power-Car.Ves);
//konets razgona
if (Car.Speed-Car.Power+Car.Ves>=0) and (Car.qGo=false) then
Car.Speed:=Car.Speed-Car.Power+Car.Ves;
//konets zadnego hoda
if (Car.Speed+Car.Power-Car.Ves<=0) and (Car.qBack=false) then
Car.Speed:=Car.Speed+Car.Power-Car.Ves;
//itogovaya skorost
//esli oboroti skorosti pozvolyayut sdvinut mashinu
if (Car.Speed>Car.Ves) or (Car.Speed<-Car.Ves) then
begin
Car.Y:=Car.Y+Sin(DegToRad(Car.Angle - 90))* Car.speed; // 90 градусов, ибо машина едет вбок
Car.X:=Car.X+Cos(DegToRad(Car.Angle + 90))* Car.speed;
end;
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key=VK_UP then
Car.qGo:=true;
if key=VK_Down then
Car.qBack:=true;
if Key=Vk_Right then
begin
Car.Angle := (Car.Angle-1) mod 360; // разберись как работает mod
IMGRotate(CarIMG, Car.Angle);
end;
if Key=Vk_Left then
begin
Car.Angle:= (Car.Angle+1) mod 360; // разберись как работает mod
IMGRotate(CarIMG, Car.Angle);
end;
end;
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key=VK_UP then Car.qGo:=false;
if key=VK_Down then Car.qBack:=false;
end;
procedure IMGRotate(IMG:TBitmap; Angle:single);
var X,Y:uint;
buf:TBitmap;
x0,y0:Integer; //center katrinki
sinus, cosinus: Extended;
Result:Tpoint;
begin
Buf:=TBitmap.Create;
Buf.Assign(IMG);
//tochka vokrug kotoroy nizhno vertet - tsentr izobrazheniya
x0 := img.Width div 2;
y0 := img.Height div 2;
Angle:=Angle*PI/180;
for X:=0 to IMG.width do
begin
for Y:=0 to IMG.Height do
begin
//vichislyaem koordinati
Result.X:=Round(x0+(x-x0)*Cos(Angle)-(y-y0)*Sin(Angle));
Result.Y:=Round(y0+(x-x0)*Sin(Angle)+(y-y0)*Cos(Angle));
Buf.Canvas.Pixels[x,y]:=Img.Canvas.Pixels[Result.X,Result.Y];
//beliy tsvet delaem prozrachnim
if (Buf.Canvas.Pixels[x,y]=clWhite) then
Buf.Canvas.Pixels[x,y]:=0;
end;
end;
OuthCarIMG.Assign(buf);
Buf.FreeImage;
Buf.Free;
end;
end.[/code]
тема на форуме
Похожие статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
пеллетные котлы
Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)