Ridimensiona un'immagine con parti non scalabili

6

Breve descrizione del problema: immagina di avere alcune immagini vettoriali e annotazioni di testo sui lati al di fuori delle immagini.

Ora il compito è quello di ridimensionare l'intera composizione preservando le proporzioni per adattarle ad alcuni punti di vista. La parte difficile è che il testo non è scalabile solo per le immagini. La distanza tra testo e immagine è ancora relativa all'intera immagine, ma la dimensione del testo è sempre una costante.

Esempio: supponiamo che la nostra composizione totale sia due volte più grande di una vista-porta. Quindi possiamo ridimensionarlo di 1/2 . Ma poiché le parti di testo hanno una dimensione di carattere fissa, diventeranno più grandi di quanto ci aspettiamo e non si adatteranno alla porta di visualizzazione.

Un'opzione che posso pensare è un processo iterativo in cui ripetiamo la scala della nostra composizione finché il delta tra esso e la porta di visualizzazione soddisfa una certa precisione. Ma questo algoritmo è piuttosto costoso in quanto comporta il lavoro con la grafica e l'immagine può essere composta da molti componenti che porteranno a molti calcoli matriciali. Inoltre, questa soluzione sembra difficile da eseguire il debug, estendere, ecc.

Esistono altri approcci per risolvere questo problema di ridimensionamento?

    
posta Uko 06.12.2012 - 16:32
fonte

3 risposte

0

Please note, part of this solution was introduced by Oleksandr Voietsa

Ok, quindi ho una risposta che potrebbe non essere l'ideale, ma funziona piuttosto bene.

Diamo un'occhiata alla prossima immagine. Una forma blu è scalabile mentre quella rossa non lo è. Nota anche che il vertice x scala con il resto dell'immagine, solo le dimensioni della forma rossa non sono scalabili. Per ora guarderemo solo l'asse X.

Orainquestasituazionecisonoduepossibilirisultati.

1:ilcomponentescalabilesiridimensionaallafinediquellononscalabileequindiabbiamounasituazionestandardincuiscaliamoun'interacomposizionescalabile:

2 : se i limiti sono di piccole dimensioni, anche il vertice x si trova dopo il bordo del componente scalabile, quindi il problema con il lance scalabili. Ma d'altra parte conosciamo già la dimensione della parte non scalabile e sappiamo che sarà posizionata vicino ai limiti. In questo modo possiamo solo ridurre le dimensioni tra i limiti della larghezza del componente non scalabile e quindi ridimensionare la parte dell'intera composizione senza parti non scalabili.

Inquestomodopossiamocalcolareentrambiirapportiperilridimensionamentoesceglierequellocherisultainun'immaginefinalepiùpiccola.

Anchenellamiaimplementazionehounvaloreattualemin/maxX/Yperciascuncomponente.Questivalorirappresentanounriquadrodidelimitazionecorrentedellapartescalabile.Ancheicomponenticonpartinonscalabilipresentanooffsetnonscalabileversol'alto,versoilbasso,versodestraeversosinistra.Inquestomodo,unacoordinatamassimaxdiquestocomponentesaràmaxX*scale+rightwardsOffset.

L'algoritmoèilprossimo:

(perunasse)

  1. Formadueraccolte:unaperglioffsetpositivieunaperinegativi.
    • Glielementidelleraccoltedevonoesserecoppiecostituitedalvaloredioffsetnonscalabileeunacoordinatadilimitescalabile_(negliesempiprecedentisaràunxcometuttodopoèconsideratononscalabile)_.
    • Ilimitiattualidellapartescalabiledell'interacomposizionedovrebberoessereaggiuntiaquestecollezionicon0offset(consifapertrovareunasoluzionecorrettasenonsonopresenticomponentinonscalabiliosonopiùpiccolienellamedioscalabileunavoltaecc...)
  2. Perognicoppiadielementidallecollezioninegativeepositivetrovaunrapportodiscalachesoddisfiglioffsetspecificati.CalcoloirapporticomesizeToScale/sizeToFit.
  3. Trovailrapportominimo(osestaicalcolandoilrapportonell'altromodorispettoamedovrestimirareaottenerel'immaginerisultantepiùpiccola)

Questoètutto.Ricorda,perglialtriassicalcoliilrapportoallostessomodoeprendimin.

Nota,partediquestasoluzioneèstataintrodottada Oleksandr Voietsa

    
risposta data 03.01.2013 - 14:48
fonte
2

Taglia le parti non scalabili, ma per ciascuna parte salvi il suo punto centrale e le dimensioni del riquadro di delimitazione.

Ridimensiona l'immagine rimanente.

Ridimensiona il punto centrale ma non le dimensioni delle parti tagliate.

Se una parte tagliata esce dall'immagine in scala, sposta il suo punto centrale in modo che si trovi appena all'interno.

Incolla le parti tagliate nei loro nuovi posti (e spera che non si sovrappongano a nient'altro).

    
risposta data 06.12.2012 - 18:52
fonte
0

Questo problema è abbastanza comune nel settore CADD (Computer Aided Drawing and Design) in cui hai dimensioni e testi che devono essere scalati in modo diverso rispetto al resto del disegno.

La soluzione di robustezza industriale utilizzata nei sistemi CAD è solitamente quella di avere una sorta di gerarchia di oggetti o di una struttura ad albero che rappresenti l'intero disegno. Ogni elemento del disegno (dimensioni e testi inclusi) è rappresentato in codice e in memoria da un oggetto diverso (un'istanza di una classe). Ogni oggetto sa come ridimensionarsi nel modo giusto. (Certo, stiamo parlando di grafica vettoriale, non raster)

Questa è una soluzione molto pesante. È sia pesante da implementare (richiede un sistema di diagrammi di scena che rappresenta il disegno e una gerarchia di classi che rappresenta gli elementi di disegno) sia da gestire (un albero come questo è grande e pesante da caricare e gestire in memoria).

Nei sistemi più piccoli, è talvolta possibile utilizzare due livelli diversi. Il primo livello, sullo sfondo, contiene l'immagine. Il secondo livello, in primo piano, è trasparente e contiene le parti non scalabili (dimensioni, testo, ecc.). I due livelli vengono spostati, ruotati e ridimensionati in sincronia tra loro ma sono ancora indipendenti. Ciò consente di ridimensionare e tradurre l'immagine principale e il livello di dimensioni / testi in diversi modi.

Questa seconda soluzione, tuttavia, richiede ancora un sistema di visualizzazione sovrapponibile / sovrapponibile e un bel po 'di codice.

Di solito, le persone che hanno bisogno di questo tipo di funzionalità usano una sorta di kernel geometrico o libreria geometrica, come l'opencascade:

link

Implementare internamente tali librerie è molto difficile ed è solitamente un compito riservato alle software house che lavorano nell'arena CADD 2D / 3D.

    
risposta data 06.12.2012 - 18:16
fonte

Leggi altre domande sui tag