Bài tập Pascal hình tứ giác

13393918_844226692343611_939308651578562139_n.png

AI GIÚP BÀI 2 HÌNH TỨ GIÁC VỚI Ạ
 

tengiday

Happy life
Reply: Hình tứ giác

Bài tứ giác này phụ thuộc vào toán nhé bạn.
- Phần kiểm tra lồi lõm của tứ giác: cho dễ thì bạn cứ viết pt đg` thằng của AB, BC, CD, DA rồi xem thử 2 điểm kia có cùng phía hay không. Mình tin tưởng đây là kiến thức cấp 3.
- Phần diện tích: công thức chung để tính cho đa giác không tự cắt (thứ tự các đỉnh đc cho theo chiều kim đồng hồ, hoặc ngược chiều) là:
Mã:
0.5 * |x1*y2 + x2*y3 + x3*y4 + x4*y1 - x2*y1 - x3*y2 - x4*y3 - x1*y4|
với A = (x1, y1),..., D = (x4, y4). Công thức này có thể làm tổng quát tính diện tích cho simple polygon.
 
Sửa lần cuối:
Mình cũng đang ôn thi tin học trẻ bảng B mà thấy mấy đề toàn kiến thức cấp 3 không sao khó thế..
bạn cho mình xin code bạn này với.mình cũng đang cần dạng này để ôn tập
 
nhờ bạn tênjday viết code bài này với ạ..lại bài liên quan tới hình nữa.mong bạn giúp
 

tengiday

Happy life
Bạn viết đại khái như thế này. Phần file bạn tự xử lý nhé. Code này có thể tổng quát cho simple polygon (đa giác ko tự cắt) luôn.
[ah]
Mã:
var x, y : array[1..5] of double;

procedure read_input;
var i : integer;
begin
    for i := 1 to 4 do
        readln(x[i], y[i]);
    x[5] := x[1]; y[5] := y[1];
end;

function area : double;
var i : integer;
begin
    area := 0;
    for i := 1 to 4 do
        area := area + x[i] * y[i + 1] - x[i + 1] * y[i];
    area := 0.5 * abs(area);
end;

function ccw(x1, y1, x2, y2, x3, y3 : double) : double;
begin
    ccw := (x2 - x1) * (y3 - y1) - (y2 - y1) * (x3 - x1);
end;

function is_convex : integer;
var i : integer;
    t0 : double;
begin
    t0 := ccw(x[1], y[1], x[2], y[2], x[3], y[3]);
    for i := 2 to 3 do
        if (t0 * ccw(x[i], y[i], x[i + 1], y[i + 1], x[i + 2], y[i + 2]) <= 0) then
            exit(0);
    exit(1);
end;
[/ah]
 
Sửa lần cuối:
const fi='tG.inp';
fo='tG.out';


TYPE MMC= array[1..5] of REAL;
VAR dt: REAL;
X,Y: MMC;
f: text;
procedure nhap;
var i : integer;


begin
assign(f,fi);
reset(f);
for i := 1 to 4 do
readln(f,x, y);
x[5] := x[1]; y[5] := y[1];
close(f);
end;


function area(X,Y:MMC) : REAL;
var i : integer;
S: REAL;


begin
S := 0;
for i := 1 to 4 do
S := S + x * y[i + 1] - x[i + 1] * y;
S := 0.5 * abs(S);
AREA:=S;
end;


function ccw(x1, y1, x2, y2, x3, y3 : REAL) : REAL;
begin
ccw := (x2 - x1) * (y3 - y1) - (y2 - y1) * (x3 - x1);
end;


function is_convex : integer;
var i : integer;
t0 : REAL;
begin
t0 := ccw(x[1], y[1], x[2], y[2], x[3], y[3]);
for i := 2 to 3 do
if (t0 * ccw(x, y, x[i + 1], y[i + 1], x[i + 2], y[i + 2]) <= 0)
THEN IS_CONVEX:=0 ELSE IS_CONVEX:=1;
end;


procedure xuat;
begin


assign(f,fo);
rewrite(f);
writeln(f, arEA(X,Y));
writeln(f,is_convex);


close(f);
end;
begin
nhap;
xuat;
end.
nhờ các bạn xem giúp xem khi text trên môi trường tublro pascal in sai kết quả
function area : real; nếu để nguyên như thế này máy sẽ báo lỗi tràn stack
 
ai giúp với chuẩn bị mai thi rồi.chạy trên tubrlo pascal thì sửa như thế nào ạ
 
Mình test thử bằng bàn phím thấy không bị sao cả. Bạn @tuonglong xem lại code is_convex, viết như thế là k đúng ý của bạn @tengiday rồi.

@tengiday: Mấy bài bạn giải tuyệt quá. Mình mới học hy vọng được bạn chỉ giúp.
 
bạn text bài của bạn tenjday phải ko ạ.mình text bên free thù ko sao bạn ơi.nhưng bên tb lại bị lỗi đó
 
thì vậy mới nói.mình text turbo text từng cái đều bị sai..
VD chỗ are đó.mình để như ban tenjday báo tràn stack
 

tengiday

Happy life
Mình ko cài đặt Turbo Pascal trên máy; nếu cần thì mình dùng online Pascal compiler thôi. Cái stack overflow error có thể do tên 'area' trùng với tên function. Bạn viết lại biến rồi sau cùng gán là đẹp.
 

Thống kê

Chủ đề
100,620
Bài viết
467,360
Thành viên
339,820
Thành viên mới nhất
thienphuvo
Top