Rakstīt ziņojumu 
 
Pavediena vērtējums:
  • 0 balsis - 0 vidējais
  • 1
  • 2
  • 3
  • 4
  • 5
Funkcija objekta mērogošanai
Autors Ziņa
Sasa Atslēdzies
Junior Member
**

Ziņojumi: 38
Pievienojās: Mar 2007
Reputācija: 1
Ziņojums: #1
Funkcija objekta mērogošanai
Sveiki,

Kā es varu aprēķināt mērogu objektam kurš man ir jāuzzīmē noteiktā ekrāna izmēros un zīmējamais objekts lielāks par šo ekrānu?
Ekrāna izmēri var mainīties dinamiski.

Šobrīd mērogu rēķinu pēc šādas formulas:
Kods:
float measure = 1;
            float ratioX = ObjectSizeXg / Screen.Width ;
            float ratioY = ObjectSizeYg / Screen.Height ;
            return measure = ratioX > ratioY ? ratioX : ratioY;

problemas sākas, tad kad ekrāna X ir lielāks par ekrāna Y, nepareizi aprēķinās mērogs, jo rotējot objektu pa 90 krādiem tā izlien ārpus ekrāna Y koardinātēm.
Un otrādī arī ir problēmas objektiem kuriem gabarīts pa Y ir lielāks nekā pa X izlien pie no ekrāna ārā pie -90 grādu pagiešanas. Nevaru saprast kur problēma!
(Šo ziņojumu pēdējo reizi modificēja: 22.03.2010 17:54 Sasa.)
22.03.2010 17:49
Atrast visus šī lietotāja rakstītos ziņojumus Citēt šo ziņu atbildē
Ēriks Klotiņš Atslēdzies
Senior Member
****

Ziņojumi: 428
Pievienojās: May 2005
Reputācija: 4
Ziņojums: #2
RE: Funkcija objekta mērogošanai
Paņem sava objekta garāko malu un mēģini iespiest ekrāna īsākajā malā:
Kods:
float size = max(Object.Width, Object.Height);
float screen = min (Screen.Width, Screen.Height);
return size > screen? screen/size : 1;
(Šo ziņojumu pēdējo reizi modificēja: 22.03.2010 19:19 Ēriks Klotiņš.)
22.03.2010 19:18
Atrast visus šī lietotāja rakstītos ziņojumus Citēt šo ziņu atbildē
Sasa Atslēdzies
Junior Member
**

Ziņojumi: 38
Pievienojās: Mar 2007
Reputācija: 1
Ziņojums: #3
RE: Funkcija objekta mērogošanai
tāds pats rezultāts, paņemu garāko malu un dalu ar ekrāna īsāko malu. Objekta izmērs pa X izlien ārpus ekrāna. Gadījumos kad objekts pa x ir garāks nekā pa y
(Šo ziņojumu pēdējo reizi modificēja: 22.03.2010 20:23 Sasa.)
22.03.2010 20:18
Atrast visus šī lietotāja rakstītos ziņojumus Citēt šo ziņu atbildē
Blekss Atslēdzies
Senior Member
****

Ziņojumi: 712
Pievienojās: Aug 2005
Reputācija: -2
Ziņojums: #4
RE: Funkcija objekta mērogošanai
(22.03.2010 20:18 )Sasa rakstīja:  tāds pats rezultāts, paņemu garāko malu un dalu ar ekrāna īsāko malu. Objekta izmērs pa X izlien ārpus ekrāna. Gadījumos kad objekts pa x ir garāks nekā pa y

esi pārliecināts ka problēma ir mēroga noteikšanā? Vienkārši Ērika piedāvātais risinājums tiešām arī atrisina visas problēmas ar mērogu... Ja taisnstūra garāko malu samazina tā lai tā ielien ekrāna īsākajā malā un pārējās malas samazina ar tādu pašu attiecību tad taisnstūris nekādi nevarētu būt ārpus ekrāna...

Varbūt vaina ir parametros ko padod savai funkcijai? Piemēram - ja tavs objekts ir paralelograms, tad tev nav jāpadod garākā mala, bet gan garākā mala + otras malas projekcija uz garākajai malai paralēlas taisnes. Ceru ka saprati manu prātojumu, ja ne varu uzzīmēt bildi.
22.03.2010 20:37
Atrast visus šī lietotāja rakstītos ziņojumus Citēt šo ziņu atbildē
Sasa Atslēdzies
Junior Member
**

Ziņojumi: 38
Pievienojās: Mar 2007
Reputācija: 1
Ziņojums: #5
RE: Funkcija objekta mērogošanai
bilde būtu vēlama, neesmu pārliecināts vai pareizi sapratu. Objekts man pārsvarā ir taisnstūris.

Gadījumā man nevajag aprēķināt mērogu divām situācijām atsevišķi, kad objekta x ir garāks par objekta y un objekta y ir garāks par objekta x??

Jo ja man objekts uz ekrāna uzzīmēts vertikāli un mainot ekrāna izmēru pa x (stiepjot horizontāli) tad man objekts aug pa y koordinātēm un vienā momentā atrodas ārpus ekrāna!
(Šo ziņojumu pēdējo reizi modificēja: 22.03.2010 20:56 Sasa.)
22.03.2010 20:50
Atrast visus šī lietotāja rakstītos ziņojumus Citēt šo ziņu atbildē
Blekss Atslēdzies
Senior Member
****

Ziņojumi: 712
Pievienojās: Aug 2005
Reputācija: -2
Ziņojums: #6
RE: Funkcija objekta mērogošanai
[Bilde attachment.php?aid=561]

1.zīmējums - garākā mala ir DC (avi AB). Ja šo malu samazināsi lai tā ietilptu ekrāna īsākajā dimensijā un pārējās malas samazināsi proporcionāli, tad nav nekādu iespēju ka objekts varētu neietilpt ekrānā. Tātad funkcija mērogu rēķinās pēc DC malas garuma un mērogs būs pareizs neatkarīgi no ekrāna proporcijām.

2.zīmējums - šeit objekta garākā mala vēljoprojām ir DC (vai AB), bet rīkojoties pēc iepriekšējā plāna rezultāts negarantē ka objekts ietilps ekrānā jo objekta platums ir mainījies. Šajā gadījumā tavai funkcijai būtu jāizmanto DE garums...

Vari iemest pilnu uzdevuma tekstu un/vai pilnu programmas kodu varbūt kāds (es diezvai) ieraudzīs kļūdu vai ieteiks kādu labu algoritmu problēmas risināšanai.
(Šo ziņojumu pēdējo reizi modificēja: 22.03.2010 21:36 Blekss.)
22.03.2010 21:32
Atrast visus šī lietotāja rakstītos ziņojumus Citēt šo ziņu atbildē
Ēriks Klotiņš Atslēdzies
Senior Member
****

Ziņojumi: 428
Pievienojās: May 2005
Reputācija: 4
Ziņojums: #7
RE: Funkcija objekta mērogošanai
Kodu un zīmējumus studijā

Man ir sajūta, ka vaina ir pavisam kaut kur citur!
22.03.2010 21:46
Atrast visus šī lietotāja rakstītos ziņojumus Citēt šo ziņu atbildē
Sasa Atslēdzies
Junior Member
**

Ziņojumi: 38
Pievienojās: Mar 2007
Reputācija: 1
Ziņojums: #8
RE: Funkcija objekta mērogošanai
jā, diezgan interesanti Smile
pārskatīju vēl reiz ko biju sarakstījis ieviesu nelielas izmaiņas un beigās rezultāts bija veiksmīgs.

Bet ko darīt tādā situācijā, kad man objekts ir sarotēts grādos kas nav 90, 180, 270, 360? Kā tad rēķināt mērogu?

Ā un vel kas, Smile mērogojoties man detaļa momentos palielinās momentos samazinās tās laikam ir atkarīgs no ekrāna izmērs attiecībā pret objektu?

Kļūda bija tajā ka es neņēmu tukšumu vērā ko biju atstājis citiem mērķiem, kur izvietot kontroļus.
Bet kods beigās sanāca šāds:
Kods:
public float CalculateMeasure(Rectangle drawingField, PartTabPage partTabPage)
        {
            //float size = max(Object.Width, Object.Height);
            //float screen = min(Screen.Width, Screen.Height);
            //return size > screen ? screen / size : 1;

            float size = partTabPage.part.GetSizeXg > partTabPage.part.GetSizeYg
                             ? partTabPage.part.GetSizeXg
                             : partTabPage.part.GetSizeYg;

            float drawField = (drawingField.Width - (partTabPage.tabPageDrawer.ZeroCordinate * 2)) < (drawingField.Height - (partTabPage.tabPageDrawer.ZeroCordinate * 2))
                             ? (drawingField.Width - (partTabPage.tabPageDrawer.ZeroCordinate * 2))
                             : (drawingField.Height - (partTabPage.tabPageDrawer.ZeroCordinate * 2));

            return size > drawField ? size / drawField : size / drawField;
        }
(Šo ziņojumu pēdējo reizi modificēja: 22.03.2010 22:15 Sasa.)
22.03.2010 21:54
Atrast visus šī lietotāja rakstītos ziņojumus Citēt šo ziņu atbildē
bubu Atslēdzies
Senior Member
****

Ziņojumi: 469
Pievienojās: Aug 2006
Reputācija: 8
Ziņojums: #9
RE: Funkcija objekta mērogošanai
(22.03.2010 21:54 )Sasa rakstīja:  Bet ko darīt tādā situācijā, kad man objekts ir sarotēts grādos kas nav 90, 180, 270, 360? Kā tad rēķināt mērogu?
Tev jau uz to atbildeja #6 postā - ņem nevis vienas malas garumu, bet rēķini objekta projekciju uz asīm un ņem garāko no šīm projekcijām.
23.03.2010 09:20
Apskatīt lietotāja interneta adresi Atrast visus šī lietotāja rakstītos ziņojumus Citēt šo ziņu atbildē
Ēriks Klotiņš Atslēdzies
Senior Member
****

Ziņojumi: 428
Pievienojās: May 2005
Reputācija: 4
Ziņojums: #10
RE: Funkcija objekta mērogošanai
Citāts:Ā un vel kas, Smile mērogojoties man detaļa momentos palielinās momentos samazinās tās laikam ir atkarīgs no ekrāna izmērs attiecībā pret objektu?
Ko tad tavuprāt dara šī rindiņa Razz
Kods:
return size > screen ? screen / size : 1;
(Šo ziņojumu pēdējo reizi modificēja: 23.03.2010 12:04 Ēriks Klotiņš.)
23.03.2010 12:04
Atrast visus šī lietotāja rakstītos ziņojumus Citēt šo ziņu atbildē
Sasa Atslēdzies
Junior Member
**

Ziņojumi: 38
Pievienojās: Mar 2007
Reputācija: 1
Ziņojums: #11
RE: Funkcija objekta mērogošanai
Atgriežoties pie vecā jautājuma. Ir reizes ja pēc šāda principa mērogo tad uz ekrāna vēl ir brīva vieta, kuru vēl varētu izmantot, nevaru izdomāt kā tad aprēķināt mērogu, lai izmantotu maksimāli ekrānu.
14.06.2011 11:55
Atrast visus šī lietotāja rakstītos ziņojumus Citēt šo ziņu atbildē
Caribou Atslēdzies
Member
***

Ziņojumi: 113
Pievienojās: Sep 2005
Reputācija: 6
Ziņojums: #12
RE: Funkcija objekta mērogošanai
Pieņemsim, ka tev ir kaut kāds objekts uzdots ar tā stūriem {(x1,y1), (x2,y2), ..., (xn,yn)}. Ja tu gribi viņu izstiept pa laukumu X reiz Y nemainot objekta aspect ratio, tad tev ir
1) Jāatrod "bounding box" izmēri tam objektam. Šajā gadījumā "bounding box" izmēri ir (max xi - min xi, max yi - min yi).
2) Vispirms palielini vai samazini tā, lai objekts pa X asi ir tieši laukuma izmēros. Ja pēc tam pa Y asi objekts salien laukumā, tad viss.
3) Ja tomēr objekts nesalien laukumā, samazini tā, lai objekts pa Y asi ir tieši laukuma izmēros.
Lai objektu izmērā u palielinātu vai samazinātu līdz izmēram v ir jāreizina visas koordinātes ar v/u. Pirms šo dara, ir ērti objektu nolikt I kvadranta stūrī - visām xi koordinātēm atņem min xi un visām yi koordinātēm atņem min yi - lai tas nelēkātu apkārt.
16.06.2011 14:49
Apskatīt lietotāja interneta adresi Atrast visus šī lietotāja rakstītos ziņojumus Citēt šo ziņu atbildē
Sasa Atslēdzies
Junior Member
**

Ziņojumi: 38
Pievienojās: Mar 2007
Reputācija: 1
Ziņojums: #13
RE: Funkcija objekta mērogošanai
par 3. punktu ja es samazinu pa Y asi tad man arī ir jāsamazina pa X asi, lai saglabātu pareizas proporcijas?
22.06.2011 15:59
Atrast visus šī lietotāja rakstītos ziņojumus Citēt šo ziņu atbildē
Caribou Atslēdzies
Member
***

Ziņojumi: 113
Pievienojās: Sep 2005
Reputācija: 6
Ziņojums: #14
RE: Funkcija objekta mērogošanai
Jā. (un tas attiecas arī uz 2) )
22.06.2011 16:10
Apskatīt lietotāja interneta adresi Atrast visus šī lietotāja rakstītos ziņojumus Citēt šo ziņu atbildē
Rakstīt ziņojumu 


Lēciens uz forumu:



Kontaktifizmati.lvAtgriezties uz augšuAtgriezties pie saturaArhīva skatsRSS sindikācija