Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Samsung Galaxy Z Fold8 Ultra: il pieghevole più famoso diventa quasi perfetto
Recensione Samsung Galaxy Z Fold8 Ultra: il pieghevole più famoso diventa quasi perfetto
Samsung rinnova la serie pieghevole di punta con Galaxy Z Fold8 Ultra: pannello interno da 8 pollici quasi senza piega, cerniera Flex Titanium, Snapdragon 8 Elite Gen 5 for Galaxy e batteria finalmente da 5.000 mAh. Prezzo italiano da 2.299 a 2.899 euro. Tra colorimetro, benchmark reali e giorni di uso quotidiano, ecco dove questo pieghevole convince e dove il nome Ultra fatica ancora a trovare piena giustificazione
Insta360 X6: Dolby Vision, 8K e montaggio "Zero Editing"
Insta360 X6: Dolby Vision, 8K e montaggio "Zero Editing"
La nuova Insta360 X6 introduce sensori Sony da 1/1.1" e un SoC Triple AI a 4nm. Analizziamo le riprese 8K, il primo Dolby Vision nativo a 10-bit nel settore sferico e l'innovativo flusso di lavoro diretto sulla futura versione 22 di DaVinci Resolve.
Due settimane con Dacia Spring 2026: novità, consumi, autonomia reale e test bagagli
Due settimane con Dacia Spring 2026: novità, consumi, autonomia reale e test bagagli
Dopo due settimane trascorse al volante della Dacia Spring 2026 possiamo raccontarvi tutto, dalle novità di motore e batteria, fino ai consumi in tutti le situazioni, compresa l'autonomia reale ad alta velocità
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 23-09-2010, 11:53   #1
nikel
Senior Member
 
L'Avatar di nikel
 
Iscritto dal: Mar 2006
Città: Milano
Messaggi: 832
[C#] Graphics.DrawLines disegnare linee con "bordi"

ciao ragazzi!

il mio problema è questo: vorrei disegnare una linea larga x che ha il centro di un colore e i due bordi di un altro..

ho provato creando un Texturebrush da una bitmap di questo tipo:

"#" bordo
"O"
"O" colore principale
"O"
"#" bordo

il problema che quando creo una pen larga x con il suddetto brush la linea mi viene riempita senza "girare la pen" al cambiamento di inclinazione della linea...

quindi il risultato è del tipo:

###
OOO
OOO
OOO
###
###
OOO
OOO
OOO
###

invece che

#OOO#
#OOO#
#OOO#

come posso fare?

grazie!

Ultima modifica di nikel : 23-09-2010 alle 11:55.
nikel è offline   Rispondi citando il messaggio o parte di esso
Old 23-09-2010, 21:07   #2
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Non conosco C# ma ho un'idea: creati una classe che rappresenti la tua linea con i bordi e faccia ciò che desideri; in particolare ti basta eseguire 3 operazioni di "disegno linea".

Una per disegnare la "linea centrale" con lo spessore "centrale" e il colore "centrale", e due per disegnare le due "linee dei bordi", con lo "spessore dei bordi" e il "colore dei bordi".
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 24-09-2010, 07:06   #3
nikel
Senior Member
 
L'Avatar di nikel
 
Iscritto dal: Mar 2006
Città: Milano
Messaggi: 832
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Non conosco C# ma ho un'idea: creati una classe che rappresenti la tua linea con i bordi e faccia ciò che desideri; in particolare ti basta eseguire 3 operazioni di "disegno linea".

Una per disegnare la "linea centrale" con lo spessore "centrale" e il colore "centrale", e due per disegnare le due "linee dei bordi", con lo "spessore dei bordi" e il "colore dei bordi".
questa era la soluzione estrema.. dovrei eseguire molto codice in più per fare ciò (nel senso di spostare un array di punti su e giù)
nikel è offline   Rispondi citando il messaggio o parte di esso
Old 24-09-2010, 08:36   #4
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da nikel Guarda i messaggi
questa era la soluzione estrema.. dovrei eseguire molto codice in più per fare ciò (nel senso di spostare un array di punti su e giù)
E perchè mai?
Supponendo che il metodo per disegnare una linea esposto dall'oggetto Graphics della libreria C# sia un metodo che prende 4 parametri, tipo:
Quote:
Graphics
void drawLine(int x1, int y1, int x2, int y2)
Ti puoi creare una classe utility che espone un metodo che prende in ingresso il riferimento al Graphics sul quale deve disegnare la linea e le coordinate della linea.
La linea da disegnare in realtà è una linea-composta, ovvero due linee singole: una di spessore uguale allo spessore totale desiderato e di colore uguale al colore dei bordi e l'altra di spessore minore, del colore della linea centrale, da disegnarci sopra.

Le caratteristiche/stato della linea-composta da rappresentare potrebbero essere:
- spessore totale linea "bordi"
- colore linea "bordi"
- spessore minore linea "centrale"
- colore linea "centrale"

A questo punto la tua classe, che potrebbe chiamarsi LineService, potrebbe tenere memorizzato questo stato in modo statico (cioè a livello di classe e non di istanza) ed esporre un metodo statico che permetta di settarlo.
Infine espone un metodo statico "draw" che prende in ingresso il riferimento al Graphic su cui disegnare, le coordinate del punto di inizio e fine della linea e disegna le due linee: prima quella più grossa, e poi sopra l'altra.

Bisognerebbe però verificare se il risultato, per certi insiemi di valori, a livello estetico, è gradevole.

Ecco uno stralcio (tanto per dare un'idea) in Java (vedi la classe LineService):
Codice:
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Stroke;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

/**
 * Class LineServiceExample
 *
 * @author Francesco Baro
 */
public class LineServiceExample
{
    public static void main(String[] args) {
        // imposto le caratteristiche della linea composta
        LineService.setEdgeLineAttributes(6.0f, Color.black);
        LineService.setCenterLineAttributes(4.0f, Color.yellow);

        // creiamo un array di coordinate per le linee
        final int[] COORD = new int[] {100,100, 200,100, 200,150, 120,250};

        // creiamo una "tela" (canvas) sulla quale eseguire
        // il disegno delle nostre linee
        final JPanel CANVAS = new JPanel() {
            @Override public void paintComponent(Graphics g) {
                final int STEP = 2;
                for (int i=0;  i<(COORD.length-STEP);  i=i+STEP)
                    LineService.draw(g, COORD[i], COORD[i+1], COORD[i+2], COORD[i+3]);
            }
        };
        CANVAS.setPreferredSize(new Dimension(640, 480));

        // creaiamo e visualizziamo la finestra che contiene
        // la nostra tela di disegno:
        final JFrame FRAME = new JFrame("LineService example");
        FRAME.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        FRAME.add(CANVAS);

        // le operazioni che rendono "visualizzabile" un componente
        // in Swing vanno fatte eseguire da un apposito thread
        SwingUtilities.invokeLater(new Runnable() {
            @Override public void run() {
                FRAME.pack(); // rende visualizzabile FRAME
                FRAME.setLocationRelativeTo(null); // centra FRAME nello schermo
                FRAME.setVisible(true); // si spiega da se, no?
            }
        });
    }
}

class LineService
{
    // line for rendering the edges
    private static Stroke edgeLineStroke;
    private static Color edgeColor;

    // line for rendering the center
    private static Stroke centerLineStroke;
    private static Color centerColor;

    public static void setEdgeLineAttributes(float width, Color color) {
        edgeLineStroke = new BasicStroke(width);
        edgeColor = color;
    }

    public static void setCenterLineAttributes(float width, Color color) {
        centerLineStroke = new BasicStroke(width);
        centerColor = color;
    }

    public static void draw(Graphics graphics, int x1, int y1, int x2, int y2) {
        Graphics2D g = (Graphics2D) graphics;

        g.setColor(edgeColor);
        g.setStroke(edgeLineStroke);
        g.drawLine(x1, y1, x2, y2);
        
        g.setColor(centerColor);
        g.setStroke(centerLineStroke);
        g.drawLine(x1, y1, x2, y2);
    }
}
vien fuori sta roba:
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)

Ultima modifica di banryu79 : 24-09-2010 alle 09:50.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 24-09-2010, 10:06   #5
nikel
Senior Member
 
L'Avatar di nikel
 
Iscritto dal: Mar 2006
Città: Milano
Messaggi: 832
vista così non sembra una cattiva idea... stasera ci provo...

io avevo pensato a disegnare 2 linee x i bordi..

ma la tua idea è molto più sensata e semplice rispetto alle mie

usando drawlineS non dovrebbero venire nemmeno i bordini sul lato piccolo in teoria ^^

grazie!
nikel è offline   Rispondi citando il messaggio o parte di esso
Old 24-09-2010, 10:24   #6
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da nikel Guarda i messaggi
io avevo pensato a disegnare 2 linee x i bordi..
Anche io all'inizio: è la cosa ovvia, ma poi uno si accorge che così gli toccherebbe calcolare e impostare un offset per le coordianate da usare nel disegno delle due linee per i bordi, mentre disegnandone una sola grossa sotto la linea centrale si evita questa operazione.

Il trade-off è che così non puoi avere i due bordi di spessore e colore diverso tra loro.

Nota che rispetto al codice postato, puoi migliorare molto LineService, a partire dal nome, dal codice ridonante, dallo supportare le caratteristiche di stroking tipiche delle penne (tipo gli stili per gli "end cap", i "line join" e così via).
A quel punto avrebbe senso avere più istanze della classe, per supportare una pluralità di stili/linee con caratteristiche diverse.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)

Ultima modifica di banryu79 : 24-09-2010 alle 10:28.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 25-09-2010, 20:40   #7
nikel
Senior Member
 
L'Avatar di nikel
 
Iscritto dal: Mar 2006
Città: Milano
Messaggi: 832
testato e perfetto... manca un pò di antialias ma tutto verrà a suo tempo...

renderizzare le strade con i bordi è tutto un'altra cosa su una mappa

grazie mille!
nikel è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione Samsung Galaxy Z Fold8 Ultra: il pieghevole più famoso diventa quasi perfetto Recensione Samsung Galaxy Z Fold8 Ultra: il pieg...
Insta360 X6: Dolby Vision, 8K e montaggio "Zero Editing" Insta360 X6: Dolby Vision, 8K e montaggio "...
Due settimane con Dacia Spring 2026: novità, consumi, autonomia reale e test bagagli Due settimane con Dacia Spring 2026: novit&agrav...
AORUS GeForce RTX 5080 INFINITY WOOD 16G: una scheda video diversa dalle altre AORUS GeForce RTX 5080 INFINITY WOOD 16G: una sc...
Hyundai Ioniq 9: dopo due settimane di test non avremmo voluto restituirla Hyundai Ioniq 9: dopo due settimane di test non ...
Per Isaacman è stato giusto cance...
iPhone 18, un report conferma l'incremen...
Sonos ha in programma il lancio delle Ac...
Debutta Grok Bot, l'IA agentica diventa ...
iPhone Ultra, un accessorio conferma un'...
AstroRad funziona: superato il test luna...
Apple dichiara iPhone X obsoleto: stop d...
C'è un motivo per cui l'interfacc...
Il volo inaugurale dell'aereo elettrico ...
L'IA non rende tutte le imprese uguali. ...
Netflix cambia la strategia sul gaming: ...
Hyundai Kona elettrica: è ancora ...
Vogliono costruire un monumento per Elon...
Ring Intercom Audio crolla a 39,99€ su A...
La Francia blocca il divieto dei social ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 19:30.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v