fix the makeOnePage bug

This commit is contained in:
Tan, Kian-ting 2023-08-06 20:04:22 +08:00
parent f0eea54944
commit 24ffcd09bd
4 changed files with 15943 additions and 0 deletions

122
Untitled2-v08061702.ml Normal file
View file

@ -0,0 +1,122 @@
(*我們先假設 P (i,j),意思是當裡面有 i 行文j 張圖的時候,存放的分頁資訊,其型別為 Pagination*)
type pagination = {mutable isPagizable : bool; mutable noOfPages : int; mutable predecessor : int * int};;
let t = 300;; (* 行數 *)
let f = 25;; (* 圖數 *)
let maxHeight = 27.0;;
let minHeight = 20.0;;
(*行屬性height 高度spaceHeight 其後空白高度isPagizable 其後空白是否可分頁*)
type line = {height : float; spaceHeight : float; mutable isPagizable : bool};;
let tArray = Array.make (t+1) {height = 0.8; spaceHeight = 0.7; isPagizable = true};;
let fArray = Array.make (f+1) {height = 12.0; spaceHeight = 1.1; isPagizable = true};;
(*tArray與fArray 第0行是空行*)
let _ = tArray.(0) <- {height = 0.0; spaceHeight = 0.0; isPagizable = false} in
let _ = fArray.(0) <- {height = 0.0; spaceHeight = 0.0; isPagizable = false} in
for i = 1 to t do
if i / 9 == 3 then
let _ = tArray.(i).isPagizable <- false in ()
else
()
done
(*連 p 0 0 都要加進去所以需要輸入 t+1 和 f+1 的矩陣*)
let p = Array.init (t+1) (fun x -> (Array.init (f+1) (fun x -> {isPagizable = false; noOfPages = -1; predecessor=(-1,-1)})) );;
let nil = -1;; (*condition value*)
(* 圖片 k 對到哪一個文字*)
let referId k =
if k <= 1 then 1
else if k <= 3 then 9
else if k <= 6 then 40
else if k==7 then 42
else if k <= 10 then 70
else if k == 11 then 80
else if k <= 15 then 112
else if k == 16 then 120
else if k == 17 then 130
else if k <= 22 then 179
else 180
(*組頁*)
let makeOnePage (p : pagination array array) a b i j =
if a == i && b == j then false
else if p.(a).(b).isPagizable == false then false
else if (referId j) > i || (referId j) == 0 then false
else
let textAndSpaceHeight =
if a == i then 0.0
else
let textHeight = Array.fold_right (+.) (Array.map (fun x -> x.height) (Array.sub tArray (a+1) (i-a))) 0.0 in
let textSpaceHeight = Array.fold_right (+.) (Array.map (fun x -> x.spaceHeight) (Array.sub tArray (a+1) (i-a-1))) 0.0 in
textHeight +. textSpaceHeight in
let figAndSpaceHeight =
if b == j then 0.0
else
let figHeight = Array.fold_right (+.) (Array.map (fun x -> x.height) (Array.sub fArray (b+1) (j-b))) 0.0 in
let figSpaceHeight = Array.fold_right (+.) (Array.map (fun x -> x.spaceHeight) (Array.sub fArray (b+1) (j-b-1))) 0.0 in
figHeight +. figSpaceHeight in
let inputHeight = textAndSpaceHeight +. figAndSpaceHeight in
if inputHeight > maxHeight then false
else if inputHeight < minHeight then false
else true;;
(*以下是分頁程式*)
let pagize p =
let _ = p.(0).(0) <- {isPagizable = true; noOfPages = 0; predecessor = (nil , nil)} in
for i=0 to t do
for j=0 to f do
for a = 0 to i do
for b = 0 to j do
if i != 0 || j != 0 then
let canMakeOnePage = makeOnePage p a b i j in
if canMakeOnePage then
let _ = p.(i).(j).isPagizable <- true in
let _ = p.(i).(j).predecessor <- (a, b) in
let _ = p.(i).(j).noOfPages <- p.(i).(j).noOfPages + 1 in
()
else
()
done
done
done
done;;
pagize p;;
for i=0 to t do
for j=0 to f do
let x1,y1 = p.(i).(j).predecessor in
Printf.printf "%d\t%d->%d\t%d\n" i j x1 y1
done
done;;
let costFuncOfPredecessor p i j pred =
let tracePage = ref [(i, j)] in
let movablePred = ref pred in
let _ =
while !movablePred != (-1, -1) do
let _ = tracePage := !movablePred :: !tracePage in
let (x, y) = !movablePred in
let _ = movablePred := p.(x).(y).predecessor in Printf.printf "%d\t%d\n" x y
done
in !tracePage;;
(*costFuncOfPredecessor p 100 15 (98, 15);;*)

7995
Untitled2.html Normal file

File diff suppressed because one or more lines are too long

BIN
Untitled2.ml Executable file

Binary file not shown.

7826
res.txt Normal file

File diff suppressed because it is too large Load diff