PDA

View Full Version : co ai biết về thuật toán vẽ ngôi sao không????



phongnhattran
30-10-2004, 23:06
Cho đệ hỏi về thuật toán vẽ ngôi sao.
đệ nhập vào một điểm bất kỳ (x,y) và độ dài d của cạng ngội sao. làm sao để vẽ thành một ngôi sao???

Chicobo
01-11-2004, 14:43
Hê tui có viết một cái vẽ ngôi sao ngày xưa trên Pascal thui có gì cứ vứt lên cho mọi người xem tạm mà cũng chả có gì chỉ tính tọa độ các điểm rùi line lại thui mà

uses graph;
var x,y:array[1..10] of integer;
i,j:integer;
length:integer;
procedure star(a,b,length:integer);
begin
x[1]:=a;
y[1]:=b;
x[2]:=round(x[1]+sin(pi/10)*length);
y[2]:=round(y[1]+cos(pi/10)*length);
x[10]:=round(x[1]-sin(pi/10)*length);
y[10]:=y[2];
x[3]:=x[2]+length;
y[3]:=y[2];
x[9]:=x[10]-length;
y[9]:=y[2];
x[4]:=round(x[3]-length*cos(pi/5));
y[4]:=round(y[3]+length*sin(pi/5));
x[8]:=round(x[9]+length*cos(pi/5));
y[8]:=y[4];
x[5]:=round(x[4]+sin(pi/10)*length);
y[5]:=round(y[4]+cos(pi/10)*length);
x[7]:=round(x[8]-sin(pi/10)*length);
y[7]:=y[5];
x[6]:=round(x[5]-cos(pi/5)*length);
y[6]:=round(y[5]-sin(pi/5)*length);
for i:=1 to 9 do
line(x[i],y[i],x[i+1],y[i+1]);
line(x[10],y[10],x[1],y[1]);
end;
Begin
i:=0;
initgraph(i,j,'d:\progra~1\tp\bgi');
star(125,15,50);
readln;
closegraph;
end.

mapleleaf
03-11-2004, 01:40
Cho đệ hỏi về thuật toán vẽ ngôi sao.
đệ nhập vào một điểm bất kỳ (x,y) và độ dài d của cạng ngội sao. làm sao để vẽ thành một ngôi sao???
Bác định vẽ ngôi sao mấy cánh? Tôi cũng chưa biết thuật toán này, nhưng để tôi nghĩ thử xem sao.

whitepenguin
03-11-2004, 19:41
Vẽ ngôi sao thì đơn gian thôi
Bác có r là ban kính ngôi sao ,tâm là x,y .Ta sẽ làn như thế này
struct Point
{float x,y;
}
khai bao một mảng gồm 5 điểm Point p[5];
bác phải tính góc của một điểm thuộc 1 trong 5 cánh của ngôi sao
360/5=72 ;đổi 72 sang radian
72*4.13/180=???;
lưu cai radian vửa đổi vào biến da;
góc xuất phát từ 0 :float a=0;
for(int i=0;i<5;i++)
{
p[i].x=x+r*cos(a);
P[i].y=y+r*sin(a);
a+=da;
}
sau khi có 5 điểm rồi thì bác nối lại thui ,nối thế nào thì bác tự làm nhá

zzzzz
03-11-2004, 21:02
thuật toán vẽ ngôi sao :

---------------------------------------------------------------------
uses graph;
var n:integer;
d:real;
procedure entergraph(path:string);
var graphdriver,graphmode,grapherror:integer;
begin
detectgraph(graphdriver,graphmode);
initgraph(graphdriver,graphmode,path);
grapherror:=graphresult;
if grapherror<>0 then
begin
writeln('Graphic Error : ',grapherrormsg(grapherror));
halt(1);
end;
end;
procedure dttphuong(d,g:real; var cd:real);
var goc:real;
dx,dy:integer;
begin
cd:=cd+g;
goc:=cd*pi/180;
dx:=round(d*cos(goc));
dy:=round(-d*sin(goc));
linerel(dx,dy);
end;
procedure sao(x,y,n:integer; d:real);
var alpha,beta,gamma,cd,t:real;
i:byte;
begin
moveto(x div 2,y div 2);
cd:=0;
t:=0;
if n<6 then
t:=180-n*30;
alpha:=360/n;
gamma:=180-alpha+t;
beta:=180-(2*alpha-t);
for i:=1 to n do
begin
dttphuong(d,beta,cd);
dttphuong(d,-gamma,cd);
end;
end;
begin
write('nhap n '); readln(n);
entergraph('D:\TP\BIN');
d:=50;
sao(getmaxx,getmaxy,n,d);
readln;
closegraph;
end.
---------------------------------------------------------------------

phongnhattran
05-11-2004, 20:58
Cái mà các bác chỉ là vẽ ngôi sao từ 5 điểm. Nhưng đệ muốn vẽ ngôi sao 5 cánh đều nhưng không vẽ các cạnh chéo nhau, theo kiểu ngôi sao trên lác cờ VN đó.
Có huynh nảo biết không?

whitepenguin
06-11-2004, 22:44
Choài tui đã nói rùi ,có 5 điểm đóa rùi thì bac nối sao là tùy bác ,nối cái đó dễ mà ,tui nói bác nối đâu có nghĩa là phãi nối theo chéo chéo đâu
Ví dụ luốn
For(int i=0;i<4;i++)
Line(p[i],p[i+1]);
Line(p[4],p[0]);
xong roài đóa

phongnhattran
13-11-2004, 10:35
Hic hic, cchắc chỉ còn cách tính thủ công vậy thôi, chứ biết sao bi giờ. Cám ơn các huynh nhiều hen.

whitepenguin
16-11-2004, 15:49
dẠ THƯA bác chả còn cách vẽ nào khác đâu ạ :D