Cómo editar formas en lenguaje C
Palabras clave edición gráfica estructura de datos píxel
Actualmente, la mayoría de las computadoras de control industrial (IPC) de bus de PC utilizadas como DDC funcionan en la interfaz DOS, pero DOS no es tan hermoso como Windows. interfaz gráfica de usuario (GUI). Si programa directamente en un lenguaje de programación, generar gráficos complejos, como diagramas de flujo de procesos, requiere mucho esfuerzo y código, y no es fácil de modificar. El diseño de software de edición de gráficos con pequeños archivos de datos y un uso reducido de memoria es un tema de investigación en el campo del control. Este artículo presenta el método de diseño de un 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
Debido a que todas las operaciones se basan básicamente en píxeles, la estructura de datos también se centra en píxeles. Tome círculos, líneas, rectángulos y cadenas como ejemplos, y otros píxeles son similares.
1. Defina los píxeles requeridos
Círculo Suct /*Defina un círculo*/
{
int x, y, r. ; /*Centro del círculo, radio*/
color de línea de caracteres, estilo de línea/*Color de la línea exterior del círculo, estilo de línea*/
color de relleno de caracteres, estilo de relleno/*Color de relleno; , modo* /
};
Línea de succión /*Definir una línea recta*/
{
int x1, y 1 ;
int x2, y2;
char color de línea, estilo de línea, grosor de línea/*color de línea, modo, grosor*/
};
Cuadro Suct /*Se define un rectángulo*/
{
int x1, y 1
int x2, y2; p>char color de línea, estilo de línea
char color de relleno, estilo de relleno
};
Suct sing /*definir cadena*/
{
int x, y;
char s[10]
color de fondo char, dir
color char s, estilo s; p>
};
.
. /*Definir otros píxeles*/
.
2. Coloque cada píxel en una lista vinculada.
typedef suct tagElementList
{
char ElementType/*Identifica la categoría del elemento*/
int ElementID/*Identificador del elemento, en Se utiliza en la interfaz para controlar sus atributos */
Elemento de marca unido {
círculo suct
cuadro suct
suct; canta canta
línea suct;
.
. /*Aquí se pueden describir otros elementos*/
.
}Elemento;
suct tagElementList * next
} ElementList
Utilizando esta estructura de datos, se puede formar un píxel en la memoria Vinculado lista, todas las operaciones pueden basarse en esta lista vinculada.
3. Defina varios punteros para diversas operaciones.
Lista de elementos * encabezado de lista. *List-end, *List-temp, * List-here;
4. Defina una variable global y registre el número de píxeles.
Recuento de elementos estáticos int = 0;
El formato del archivo gráfico es: el primer byte (char) representa el color de fondo de todo el gráfico, la siguiente palabra corresponde a Elementcount; , Representa 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 principalmente: dibujo, modificación, movimiento, eliminación y copia. A continuación se muestran solo algunos ejemplos para ilustrar los métodos de implementación.
1. Imágenes
Tome el círculo como ejemplo y otros gráficos son similares.
Dibujar un círculo()
{
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*/
cx = cursor-x;
cy = cursor-y;
movecursor(); =(int)sqrt( (Cursor-x-cx)*(Cursor-x-cx)(Cursor-y-cy)*(Cursor-y-cy);
setcolor(blanco);
Círculo (cx, cy, Cr); /*Dibujar un círculo*/
cls = selectlinestyle();
CLC = seleccionar color(" select- color-linea ");
establecer color(CLC);
for(I = 0;i<=clsi)
circulo(cx,cy,Cr -I) ;
CFS = selectfillstyle();
CFC = seleccionar color(" set-fill-color ");
setfillstyle(CFS . CFC );
Relleno de inundación(cx,cy,CLC);/*fill*/
temp(lista de elementos *)malloc(sizeof(lista de elementos));
temp->elemento tipo="c"
temp->elemento .círculo .
temp->elemento y = cy;
temp->elemento \r = Cr;
temp->elemento .lcolor = CLC;
temp->elemento l estilo = cls; /p>
temp->; elemento. f color = CFC;
temp->; elemento f. );/*Agregar píxeles a la lista de enlaces de píxeles*/
}
Addtolist() se puede implementar de la siguiente manera:
addtolist ( ElementList *Etemp)
{
if(List-head==NULL)
{
list-head = Etemp;
list-end = Etemp;
}
Otro
{Fin de la lista-> next = Etemp
list-end = Etemp;
etemp-& gt; siguiente = NULL
}
Recuento de elementos
}
2 La función de mover, eliminar y copiar gráficos.
Tomemos el movimiento como ejemplo. Primero, use las teclas de flecha o el cuadro del mouse para seleccionar el área que desea mover. Las coordenadas de la esquina superior izquierda y la esquina inferior derecha del rectángulo del área son (bloque-x1, bloque-y1) y (bloque-x2, bloque-y2) respectivamente. Luego mueva el rectángulo del logotipo a donde desee que esté y confirme. Hay una desviación entre la posición final y la posición inicial del rectángulo, y las desviaciones horizontal y vertical son DL-X y DL-Y respectivamente.
A continuación, busque la lista vinculada de píxeles en la memoria, determine el rectángulo delimitador de cada píxel y determine si el rectángulo delimitador está en el rectángulo de reconocimiento inicial. Si es así, cambie el valor del atributo de coordenadas del píxel. a DL-X, DL -Y.. borra el área de gráficos y dibuja basándose en una nueva lista vinculada de píxeles.
La función de eliminar 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 de píxel calificado, 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;
select block();/*Seleccione el bloque a mover*/
move block();/*Mover bloque*/
List-temp = List-head; p>
mover bloque(); p>
for(I = 0; i & ltElementcount i)
{
geect(& rect, List-temp) /* Calcular puntos temporales de lista al borde del píxel*/
if (inblock(rect.x1, rect.x2, rect.y1.rect.y2))
/* Determine si el borde está en el bloque seleccionado en*/
/data/2006/0126/article _ htm
.