วิธีการคิดขั้นตอนวิธีการจัดเรียงหน้าต่าง (ปรับขนาดได้) บนหน้าจอเพื่อให้ครอบคลุมพื้นที่มากที่สุด


20

ฉันต้องการเขียนโปรแกรมง่าย ๆ ที่ยอมรับชุดของ windows (ความกว้าง + ความสูง) และความละเอียดหน้าจอและแสดงผลการจัดเรียงของหน้าต่างเหล่านั้นบนหน้าจอเพื่อให้ windows ใช้พื้นที่มากที่สุด ดังนั้นจึงเป็นไปได้ที่จะปรับขนาดหน้าต่างในขณะที่รักษา output size >= initial sizeและอัตราส่วนกว้างยาว ดังนั้นสำหรับหน้าต่างฉันต้องการขั้นตอนวิธีการที่จะกลับขอบเขตของความกว้างความสูง)( x , y , w ฉันd t h , h e ฉันg h t )i(x,y,width,height)

ฉันเชื่อว่านี่อาจเป็นรูปแบบของเครื่องเป้ 2D ฉันได้ลองดูผลลัพธ์รอบ ๆ เว็บ แต่พวกเขาส่วนใหญ่มีพื้นหลังมากมาย (และไม่มีการติดตั้ง) ที่ทำให้ฉันติดตามได้ยาก

ฉันไม่ค่อยสนใจอัลกอริทึมที่เร็วที่สุดเท่าที่จะเป็นไปได้ แต่ในบางสิ่งบางอย่างที่ใช้งานได้จริงสำหรับความต้องการเฉพาะของฉัน


1
หากคุณกำลังปรับขนาดหน้าต่างคุณไม่ได้ "รักษาขนาดเริ่มต้น" ไว้เพียงอัตราส่วนของภาพ
Emre

1
คุณสามารถปรับขนาดหน้าต่างเดียวเพื่อให้ครอบคลุมหน้าจอปัญหาคืออะไร

2
ฉันสองความคิดเห็นของ Saeed คุณต้องมีข้อ จำกัด เพิ่มเติมเช่นขนาดที่เล็กที่สุดเป้าหมายของการย่อขนาดผลรวมของการ resizings ถ้าคุณต้องการที่จะไม่รวมการแก้ปัญหาเล็กน้อย Nota Bene: คณิตศาสตร์ดูเหมือนจะเรียกปูกระเบื้องปัญหาtessellations
Raphael

1
อาจจะเป็นการดีกว่าถ้าคุณต้องการเพิ่มพื้นที่หน้าต่างที่สามารถดูได้ต่ำสุดและลดพื้นที่หน้าต่างที่สามารถดูได้สูงสุด แต่อนุญาตให้มีข้อขัดแย้งได้หรือไม่ โปรดแก้ไขคำถามของคุณเพื่อให้ปราศจากข้อผิดพลาดการคิดถึงคำชี้แจงปัญหาปัจจุบันไม่ใช่เรื่องง่าย

2
WminwWsize(w)W

คำตอบ:


9

แม้ว่าคำถามของคุณจะไม่พูด แต่ฉันคิดว่าคุณไม่ต้องการให้หน้าต่างเหลื่อมกัน

วิธีการหนึ่งในการแก้ไขปัญหานี้คือการใช้ข้อ จำกัด เช่นแก้Choco มีใครเขียนข้อ จำกัด ในการเข้ารหัสปัญหาของคุณออกมาแก้ปัญหาเพื่อกระทำอย่างชาญฉลาดแล้วปล่อยให้มันทำงาน ซึ่งหมายความว่าการคิดทั้งหมดที่คุณต้องทำจะถูกใช้เพื่อค้นหาวิธีที่ดีในการเข้ารหัสปัญหาไม่ใช่ในการคิดขั้นตอนวิธีและทำการเขียนโปรแกรมและปรับแต่ง นี่คือคำตอบบางส่วนเพื่อให้คุณเริ่มต้น

สมมติว่าขนาดหน้าจอโดย{}xmax×ymax

สำหรับแต่ละหน้าต่างคุณจะมีชุดของตัวแปรและข้อ จำกัดx ฉัน , Y ฉัน , H ฉัน , W ฉันWixi,yi,hi,wi

  • xi,yi,hi,wi0
  • xi+wixmax
  • yi+hiymax
  • อาจมีข้อ จำกัด บางประการเกี่ยวกับขนาดที่เล็กที่สุดของหน้าต่างเช่นเป็นต้นhi100
  • ข้อ จำกัด ด้าน: หากอัตราส่วนกว้างยาว 3: 4 ข้อ จำกัด อาจเป็นโดยที่เป็นคำผิดพลาดที่ไม่ใช่ศูนย์ขนาดเล็กเพื่อให้ไม่สมบูรณ์ ขนาดหน้าต่างมิฉะนั้นคุณจะมีปัญหามากเกินไปϵ4hiϵ3wi4hi+ϵϵ

ตอนนี้คุณต้องดูแลหน้าต่างที่ทับซ้อนกัน สำหรับคู่ของหน้าต่างแต่ละที่คุณจะสร้างข้อ จำกัด เช่นต่อไปนี้ซึ่งจับภาพมุมที่ไม่ปรากฏอยู่W_iสำหรับ , สร้างข้อ จำกัด :Wi,WjijWjWi(x,y){(xj,yj),(xj+wj,yj),(xj,yj+hj),(xj+wj,yj+hj)}

  • ¬(xixxi+wjyiyyi+hj)h_j)

ข้อ จำกัด ที่ระบุไว้ในตอนนี้จะอธิบายเฉพาะหน้าต่างที่ไม่ได้ซ้อนทับกันซึ่งไม่กระจายไปทางด้านข้างของหน้าจอซึ่งเป็นไปตามข้อ จำกัด ขนาดเล็กที่สุดและรักษาอัตราส่วนภาพไว้

เพื่อให้ได้ขนาดที่พอดีคุณต้องระบุเมตริกที่รวบรวมความหมายของรูปแบบที่ดี ความเป็นไปได้อย่างหนึ่งคือการสมมติว่าคุณต้องการให้ windows มีขนาดและ / หรือคุณต้องการลด "white space" ให้แคบที่สุด ฉันไม่คิดว่าสิ่งนี้สามารถระบุได้โดยใช้ Choco แต่อาจเป็นไปได้ด้วยการแก้ไขข้อ จำกัด อื่น (คนอื่นอาจช่วยได้ที่นี่)

Choco อนุญาตให้หนึ่งเพิ่ม wrt สูงสุดไปยังฟังก์ชันวัตถุประสงค์ที่ระบุเป็นตัวแปรเดี่ยว จากความคิดนี้คุณสามารถเพิ่มสิ่งต่อไปนี้ได้สูงสุด:

  • i(hi+wi)

โดยการเขียนข้อ จำกัดและบอก Choco เพื่อเพิ่ม{}cost=i(hi+wi)cost


สิ่งนี้ดูมีแนวโน้มและฉันจะเล่นกับ Choco อย่างแน่นอนเพื่อดูว่ามันทำงานอย่างไรและรวดเร็วแค่ไหน
daniel.jackson

แต่ทำไมวลีที่ว่าโดยทั่วไป? ฉันคิดว่าคุณสามารถ จำกัด ข้อ จำกัด ให้เป็นอสมการเชิงเส้นซึ่งหมายความว่าสิ่งที่คุณมีคือโปรแกรมเชิงเส้นวานิลลา
Suresh

@Suresh: รู้สึกอิสระที่จะทำอย่างละเอียด ฉันไม่เห็นวิธีทันที
Dave Clarke

1

ฉันเริ่มเขียนต้นแบบสำหรับโซลูชันเดรัจฉานแรงที่หวังว่าจะสามารถปรับให้เหมาะกับจุดที่จะใช้งานได้จริง

ขั้นแรกให้คำจำกัดความบางประการ: ให้เป็นชุดของหน้าต่างทั้งหมด แต่ละหน้าต่างประกอบด้วยสำหรับพิกัด x, y และความกว้างและความสูง หน้าต่างเริ่มต้นด้วยความกว้างและความสูงต่ำสุดWwxw,yw,ww,hw

อินพุตของอัลกอริทึมคือหน้าจอซึ่งมีความกว้างและความสูงและรายการของหน้าต่างS

มันทำงานได้ประมาณ:

void fit(W, S, i, n, result)
    if i == n
        if S.score() < result.score()
            result = S
        return

    w = W[i]
    foreach x, y in S.coordinates()
        set w position to (x, y)
        while S.put(w) # check that w doesn't overlap with S's other windows and add it
            fit(W, S, i+1, n, result)
            S.windows.pop()
            w.grow()
        w.restoresize()

มีบางสิ่งที่ควรปรับปรุง:

  • S.coordinates()ช้ามากตอนนี้ มันวนซ้ำคะแนนทั้งหมดS.width x S.heightและตรวจสอบว่าแต่ละอันอยู่ในหนึ่งในหน้าต่างของ S หรือไม่

  • S.put()ตรวจสอบว่าพารามิเตอร์ของมันซ้อนทับกับส่วนที่เหลือของหน้าต่าง S โดยทำแบบทดสอบที่กล่าวถึงในคำตอบของเดฟ บางทีนี่อาจปรับปรุงได้โดยใช้ต้นไม้ช่วงเวลา ?

  • S.score()ปัจจุบันส่งกลับซึ่งเป็นพื้นที่ของหน้าต่างทั้งหมด มันต้องคำนึงถึงตัวแปรอื่น ๆ เพื่อสร้างเลย์เอาท์ที่ดีขึ้นwS.windows(hwww)

  • ฟังก์ชั่นด้านบนต้องลองใช้พีชคณิตทั้งหมดของเพื่อให้ได้ผลลัพธ์ที่ดีที่สุดW

ขณะนี้ฉันกำลังพยายามหาโครงสร้างข้อมูลที่เหมาะสมเพื่อแสดงหน้าจอและหน้าต่างมันต้องการการสนับสนุนการค้นหาเหล่านี้:

  • ส่งคืนรายการพิกัดที่สามารถกำหนดตำแหน่งหน้าต่างได้โดยไม่ทับซ้อนกับหน้าต่างอื่น
  • แทรกหน้าต่างที่ตำแหน่ง x, y (ตรวจสอบแล้วว่าไม่ซ้อนกัน)
  • ส่งคืน windows ทั้งหมด
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.