Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Renault 5 elettrica al giudizio definitivo: solo stupore iniziale o premi meritati?
Renault 5 elettrica al giudizio definitivo: solo stupore iniziale o premi meritati?
Dopo più di un anno dal primo test drive ci siamo rimessi al volante della Renault 5 E-Tech Electric, questa volta utilizzandola come prima auto per circa due settimane. Scoprite con noi se il progetto convince ancora
HONOR CHOICE Projector Air Pro: piccolo, portatile e con Netflix
HONOR CHOICE Projector Air Pro: piccolo, portatile e con Netflix
Un proiettore economico, che fa della portabilità e immediatezza i suoi punti di forza. Adatto per una camera da letto o per la casa vacanze, è basato su sistema proprietario Linux ma offre piena compatibilità ufficiale a Netflix
ASUS ProArt GoPro Edition è il notebook compatto per chi crea
ASUS ProArt GoPro Edition è il notebook compatto per chi crea
Un notebook sviluppato in collaborazione con GoPro ma che risponde al meglio alle necessità di tutti coloro che creano contenuti video: robustezza, design, potenza di calcolo e funzionalità si abbinano al meglio tra di loro, pur se a prezzo di un costo elevato per via della tanta memoria onboard
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


Renault 5 elettrica al giudizio definitivo: solo stupore iniziale o premi meritati? Renault 5 elettrica al giudizio definitivo: solo...
HONOR CHOICE Projector Air Pro: piccolo, portatile e con Netflix HONOR CHOICE Projector Air Pro: piccolo, portati...
ASUS ProArt GoPro Edition è il notebook compatto per chi crea ASUS ProArt GoPro Edition è il notebook c...
Fable e Sol a confronto: due cartoni animati creati su un PC con RTX 3090 Fable e Sol a confronto: due cartoni animati cre...
Il tablet rugged leggero e sottile: Lenovo ThinkTab X11 offre resistenza, doppia USB-C e batteria rimovibile Il tablet rugged leggero e sottile: Lenovo Think...
TSMC accelera sui 1,4 nanometri: produzi...
Razer compra StreamElements: cambia tutt...
Il Task Manager di Windows arriva su Mac...
Sony: PS5 resta più conveniente d...
Ubisoft spegne uno dei suoi esperimenti ...
Garante Privacy: multa da 9,5 milioni di...
Windows 11, Microsoft promette un sistem...
Windows 11, l'ultima build sperimentale ...
YouTube cancella i canali ASMR più...
Valgono miliardi, ma non pubblicano rice...
ROG Falchion Ace 75 HE: ASUS fa sul seri...
Google rilascia il primo teaser dei Pixe...
Attenti a queste TV Box: a TV spento si ...
Radeon RX 9050: arriva il primo confront...
L'AI Act più severo slitta al 202...
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:06.


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