using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
namespace Circolo
{
struct Tratto
{
public PointF inizio;
public PointF fine;
public Tratto(float x0, float y0, float xf, float yf)
{
inizio
= new PointF
(x0, y0
);
fine
= new PointF
(xf, yf
);
}
public float Distanza()
{
float dx, dy;
dx = fine.X - inizio.X;
dy = fine.Y - inizio.Y;
return (float)(Math.Sqrt(dx * dx - dy * dy));
}
}
class Grafica
{
private Graphics foglio = null;
private Tratto limiti;
private PointF scale;
private Point estremiFoglio;
private Pen pennino;
public Grafica()
{
foglio = null;
scale
= new PointF
(0f, 0f
);
estremiFoglio
= new Point
(0, 0
);
pennino = null;
}
protected void Dimensiona(Graphics posto, Tratto diagonale)
{
foglio = posto;
Normalizza(ref diagonale);
limiti = diagonale;
LimitiFoglio();
scale.X = estremiFoglio.X / (limiti.fine.X - limiti.inizio.X);
scale.Y = estremiFoglio.Y / (limiti.fine.Y - limiti.inizio.Y);
pennino
= new Pen
(Color.
FromArgb(10, 10, 10
), 1
);
}
protected void Dimensiona(Graphics posto, float x0, float y0, float xf)
{
foglio = posto;
limiti.inizio.X = x0;
limiti.inizio.Y = y0;
limiti.fine.X = xf;
LimitiFoglio();
scale.X=estremiFoglio.X / (limiti.fine.X - limiti.inizio.X);
scale.Y = scale.X;
limiti.fine.Y = (estremiFoglio.Y / scale.Y) + limiti.inizio.X;
pennino
= new Pen
(Color.
FromArgb(10, 10, 10
), 1
);
}
public void Linea(Tratto segmento)
{
Trasla(ref segmento.inizio);
Trasla(ref segmento.fine);
foglio.DrawLine(pennino, segmento.inizio, segmento.fine);
}
public void Linea(float x0, float y0, float xf, float yf)
{
Linea
(new Tratto
(x0, y0, xf, yf
));
}
public void Cerchio(PointF centro, double raggio)
{
double alfa, omega, passo;
Tratto linea
= new Tratto
();
linea.inizio.X = (float)(centro.X + raggio);
linea.inizio.Y = centro.Y;
omega = Math.PI * 2.0;
alfa = 0.0;
passo = (omega - alfa) / 200.0;
while (alfa <= omega)
{
alfa += passo;
linea.fine.X = (float)(centro.X + raggio * Math.Cos(alfa));
linea.fine.Y = (float)(centro.Y + raggio * Math.Sin(alfa));
this.Linea(linea);
linea.inizio = linea.fine;
}
}
public void DaiPunto(PointF coordinata)
{
Trasla(ref coordinata);
foglio.DrawLine(pennino, coordinata.X, coordinata.Y, coordinata.X + 1f, coordinata.Y);
}
public void Assi(Pen penninoAssi)
{
if (penninoAssi != null)
{
PointF origine
= new PointF
(0f, 0f
);
Trasla(ref origine);
foglio.DrawLine(penninoAssi, 0f, origine.Y, estremiFoglio.X, origine.Y);
foglio.DrawLine(penninoAssi, origine.X, 0f, origine.X, estremiFoglio.Y);
}
}
public void Cancella(Color sfondo)
{
foglio.Clear(sfondo);
}
public Pen Penna
{
get
{
return new Pen
(pennino.
Color, pennino.
Width);
}
set
{
pennino
= new Pen
(value.
Color, value.
Width);
}
}
private void Trasla(ref PointF punto)
{
punto.X = scale.X * (punto.X - limiti.inizio.X);
punto.Y = estremiFoglio.Y - (scale.Y * (punto.Y - limiti.inizio.Y));
if (punto.X < 0f)
{
punto.X = -1f;
}
if (punto.X > estremiFoglio.X)
{
punto.X = estremiFoglio.X + 1f;
}
if (punto.Y < 0f)
{
punto.Y = -1f;
}
if (punto.Y > estremiFoglio.Y)
{
punto.Y = estremiFoglio.Y + 1f;
}
}
private void Normalizza(ref Tratto segmento)
{
float temp;
if (segmento.inizio.X > segmento.fine.X)
{
temp = segmento.inizio.X;
segmento.inizio.X = segmento.fine.X;
segmento.fine.X = temp;
}
if (segmento.inizio.Y > segmento.fine.Y)
{
temp = segmento.inizio.Y;
segmento.inizio.Y = segmento.fine.Y;
segmento.fine.Y = temp;
}
}
private void LimitiFoglio()
{
int x=1, y=1;
while (foglio.IsVisible(x, 1))
{
x++;
}
while (foglio.IsVisible(1,y))
{
y++;
}
estremiFoglio.X = x - 1;
estremiFoglio.Y = y - 1;
}
}
}