Cómo editar gráficos usando lenguaje C
Este artículo presenta el método de diseño de un programa universal de edición de gráficos que genera archivos de píxeles en la interfaz DOS.
Palabras clave, gráficos, edición de píxeles de estructura de datos
La mayoría de las computadoras industriales de bus de PC (IPC) que se utilizan actualmente como DDC funcionan en la interfaz DOS, y DOS no tiene una apariencia tan hermosa como Windows Cómoda interfaz gráfica de usuario (GUI). Generar gráficos complejos, como diagramas de flujo de procesos, requiere mucho esfuerzo y código si se programa directamente en un lenguaje de programación y es difícil de modificar. El diseño de software de edición de gráficos que tenga archivos de datos pequeños y ocupe menos memoria es un tema de investigación en la comunidad de control. Aquí presentamos un método de diseño para software de edición de gráficos general que genera archivos de datos de píxeles
1 Estructura de datos y formato de archivo de datos
Dado que todas las operaciones se basan básicamente en píxeles. , la estructura de datos también se centra en píxeles. A continuación se utilizan círculos, líneas, rectángulos y cadenas como ejemplos. Otros píxeles son similares.
1. Defina los píxeles requeridos
suct círculo /*defina círculo*/
{
int x, y, r ; /* Centro del círculo, radio*/
char color de línea, estilo de línea /* Color de la línea exterior del círculo, estilo de línea*/
char color de relleno, estilo de relleno /* Color de relleno, modo * /
};
línea de succión /* Definir línea recta*/
{
int x1, y1;
int x2, y2;
char color de línea, estilo de línea, grosor de línea /* color de línea, modo, grosor*/
};
suct box /* Definir rectángulo*/
{
int x1, y1;
int x2, y2
char linecolor, linestyle;
char fillcolor, fillstyle
};
suct sing /* definir cadena*/
{
int x, y;
char s[10]
char backcolor, dir;
char s-color, s-style;
};
.
/* Definir otros píxeles*/
.
2. se coloca en una lista enlazada
typedef suct tagElementList
{
char ElementType /* identifica el tipo de elemento*/
int; ElementID; /* Identificador de elemento, utilizado para controlar sus propiedades en la interfaz */
union tagElement {
suct círculo círculo;
suct box box <; /p>
suct sing sing;
suct line line;
.
/* Aquí se pueden indicar otros elementos*/ p. >
.
}Elemento;
suct tagElementList *next;
}ElementList;
Utilice esta estructura de datos Un píxel La lista vinculada se puede formar en la memoria y todas las operaciones se pueden basar en esta lista vinculada.
3. Defina varios punteros para prepararse para diversas operaciones
ElementList *List-head *List-end, *List-temp, *List-here;
<. p>4. Defina una variable global para registrar el número de elementosstatic int Elementcount=0;
El formato del archivo de gráficos es: el primer byte (char), que indica el fondo. el color de todo el gráfico; la siguiente palabra (palabra) corresponde a Elementcount, que indica el número de píxeles seguido del valor del atributo de cada píxel en la lista vinculada de memoria;
2. Implementación de funciones de edición de gráficos
Las funciones de edición de gráficos incluidas en este software incluyen: dibujo, modificación, movimiento, eliminación y copia. A continuación se muestran algunos ejemplos. ilustrar el método de implementación.
1. Dibujar
Toma un círculo como ejemplo, otras formas son similares.
drawcircle()
{
int i;
char s[20], c
int cx, cy, cr;
int cls, clc, cfc, cfs;
movecursor() /* Mueve el cursor para determinar el centro del círculo*/ p>
cx=cursor-x;
cy=cursor-y;
movecursor(); /* Determinar el radio*/
cr =(int)sqrt( (cursor-x-cx)*(cursor-x-cx) (cursor-y-cy)*(cursor-y-cy);
setcolor(BLANCO);
círculo (cx, cy, cr); /* dibuja un círculo*/
cls=selectlinestyle();
clc=selectcolor ("select-line -color");
cls=selectlinestyle();
clc=selectcolor ("select-line-color");
p>
setcolor(clc);
for(i=0;ilt;=cls;i)
circle(cx, cy, cr-i);
p>cfs=selectfillstyle();
cfc=selectcolor("set-fill-color");
setfillstyle(cfs.cfc);
relleno (cx, cy, clc); /* fill*/
temp(ElementList *) malloc(sizeof(ElementList));
temp-gt;ElementType= ' c';
temp-gt;Element.circle.x=cx;
temp-gt;Element.circle.y=cy;
temp- gt;Element .circle.r=cr;
temp-gt;Element.circle.lcolor=clc;
temp-gt;Element.circle.lstyle=cls;
p>
temp-gt;Element.circle.fcolor=cfc;
temp-gt;Element.circle.fstyle=cfs;
addtolist(temp); /* Agregar píxeles a la lista enlazada de píxeles*/
}
El addtolist () se puede implementar de la siguiente manera:
addtolist (ElementList *Etemp)
{
if(List-head==NULL)
{
List-head=Etemp;
List-end =Etemp;
}
else
{ List-end-gt; next=Etemp
List- end=Etemp;
Etemp-gt; siguiente=NULL;
}
Recuento de elementos
}
2. Funciones de mover, eliminar y copiar gráficos
Tome el movimiento como ejemplo. Primero, use las teclas de flecha o el marco del mouse para seleccionar el área a mover. el área del rectángulo es (bloque-x1, b
lock-y1), (block-x2, block-y2), y luego mueva el rectángulo de identificación al lugar al que desea llegar, OK. De esta manera, existe una desviación entre la posición final del rectángulo del logotipo y la posición inicial. Las desviaciones horizontal y vertical son dl-x y dl-y respectivamente.
A continuación, busque la lista vinculada de píxeles de memoria, determine el rectángulo circunscrito de cada píxel y determine si el rectángulo circunscrito está dentro del rectángulo de identificación inicial. Si es así, cambie el valor del atributo de coordenadas del píxel a dl. -x.,dl-y. Borre el área de gráficos y dibuje según la nueva lista de píxeles.
La función de eliminación de gráficos es similar. Solo necesita borrar los píxeles que cumplen las condiciones de la lista vinculada y luego modificar el valor de Elementcount.
Para copiar un gráfico, solo necesita hacer una copia de seguridad de un nodo del píxel que cumpla las condiciones, modificar el valor del atributo de coordenadas del nodo, luego agregar el nodo a la lista vinculada y aumentar el valor. de Elementcount en consecuencia.
El siguiente es el código para mover gráficos.
fnMove()
{
Rect rect /* rectángulo definido*/
int i;
selectblock (); /* Selecciona el bloque a mover*/
moveblock (); /* Mover el bloque*/
List-temp=List-head;
for (i=0; ilt; Elementcount; i )
{
geect (amp; rect, List-temp); /* Calcula qué puntos List-temp); al rectángulo circundante del píxel*/
if (inblock(rect.x1, rect.x2, rect.y1.rect.y2))
/* Determine si el rectángulo circundante El rectángulo se encuentra dentro del bloque de selección*/
/data/2006/0126/article_10790.htm