Я пытаюсь нарисовать связанные линии, используя холст из данных в таблице MySql. Таблица (gene_dna_segments) содержит длину каждого сегмента линии и название сегмента.Canvas and PHP - Рисование связанных сегментов линии
Желаемый выход представляет собой непрерывную прямую горизонтальную линию, состоящую из каждого из сегментов. Каждый сегмент также должен иметь имя сегмента, показывающую выше соответствующего сегмента, как показано на рисунке ниже:
+----------------------+--------------------+------------------+--------------------+
| gene_dna_segments_pk | gene_expression_fk | dna_segment_name | dna_segment_length |
+----------------------+--------------------+------------------+--------------------+
| 1 | 11 | Exon 1 | 50 |
| 2 | 11 | Intron 1 | 75 |
| 3 | 11 | Exon 2 | 20 |
| 4 | 11 | Intron 2 | 90 |
+----------------------+--------------------+------------------+--------------------+
Запрос (старинке не PDO ...):
$query_dna = "SELECT * FROM gene_dna_segments WHERE gene_expression_fk = '11'";
$result_dna = mysql_query($query_dna, $connection) or die(mysql_error());
Дисплей:
<canvas id="canvas" width="800" height="500"></canvas>
<script type="text/javascript">
var canvas = document.getElementById('canvas');
var context = canvas.getContext('2d');
<?php
while($row_dna = mysql_fetch_assoc($result_dna)) {
echo "context.beginPath();context.moveTo(100, 100);context.lineTo(" . $row_dna['dna_segment_length'] . ", 100);context.lineWidth = 12;context.strokeStyle = '#009543';context.stroke();context.font = 'bold 12pt Calibri';
context.fillStyle = '#009543';
context.fillText('" . $row_dna['dna_segment_name'] . "', 180, 90);";
}
?>
</script>
Теперь отрезки и текст, как это определено я n таблица выполнена ОК, но друг над другом, так как context.moveTo(100, 100)
одинакова для каждой строки, которая выводится во время цикла while. Как это следует обрабатывать так, чтобы сегменты рисовались как сплошная линия?
Возможно, проще всего добавить столбец начальной точки в таблицу и рассчитать начальные точки для каждого сегмента на основании длиной предыдущего сегмента ... Я открыл отдельный вопрос о такой возможности Calculating new array values based on another numeric array
Обратите внимание, что «нормальный» код для рисования строк похож на следующий код, обратите внимание, что части moveto начинаются в конце предыдущей строки. Мне нужно сделать то же самое в петле ...
var canvas = document.getElementById('canvas');
var context = canvas.getContext('2d');
context.beginPath();
context.moveTo(100, 100);
context.lineTo(150, 100);
context.lineWidth = 12;
context.strokeStyle = '#009543';
context.stroke();
context.font = 'bold 11pt Calibri';
context.fillStyle = '#009543';
context.fillText('Exon 1', 105, 90);
context.beginPath();
context.moveTo(150, 100);
context.lineTo(225, 100);
context.lineWidth = 12;
context.strokeStyle = '#e97300';
context.stroke();
context.font = 'bold 11pt Calibri';
context.fillStyle = '#e97300';
context.fillText('Intron 1', 165, 90);
context.beginPath();
context.moveTo(225, 100);
context.lineTo(275, 100);
context.lineWidth = 12;
context.strokeStyle = '#009543';
context.stroke();
context.font = 'bold 11pt Calibri';
context.fillStyle = '#009543';
context.fillText('Exon 2', 230, 90);
context.beginPath();
context.moveTo(275, 100);
context.lineTo(375, 100);
context.lineWidth = 12;
context.strokeStyle = '#e97300';
context.stroke();
context.font = 'bold 11pt Calibri';
context.fillStyle = '#e97300';
context.fillText('Intron 2', 300, 90);
Предупреждение !!! mysql_ * функции обесцениваются http://stackoverflow.com/q/12859942/829533 – zzlalani
Я хорошо знаю об этом ... – IlludiumPu36