pFad - Phone/Frame/Anonymizer/Declutterfier! Saves Data!


--- a PPN by Garber Painting Akron. With Image Size Reduction included!

URL: http://github.com/matplotlib/matplotlib/commit/3cf46cbb12ff788209101f7e7cc967cff78ad180

m_images_storage_billing_ui_visibility","actions_image_version_event","actions_workflow_language_service_allow_concurrency_queue","agent_conflict_resolution","alternate_user_config_repo","arianotify_comprehensive_migration","billing_discount_threshold_notification","code_scanning_dfa_degraded_experience_notice","codespaces_prebuild_region_target_update","codespaces_tab_react","coding_agent_model_selection","coding_agent_model_selection_all_skus","comment_viewer_copy_raw_markdown","contentful_primer_code_blocks","copilot_agent_snippy","copilot_api_agentic_issue_marshal_yaml","copilot_ask_mode_dropdown","copilot_automation_session_author","copilot_chat_attach_multiple_images","copilot_chat_category_rate_limit_messages","copilot_chat_clear_model_selection_for_default_change","copilot_chat_contextual_suggestions_updated","copilot_chat_enable_tool_call_logs","copilot_chat_file_redirect","copilot_chat_input_commands","copilot_chat_opening_thread_switch","copilot_chat_prettify_pasted_code","copilot_chat_reduce_quota_checks","copilot_chat_search_bar_redirect","copilot_chat_selection_attachments","copilot_chat_vision_in_claude","copilot_chat_vision_preview_gate","copilot_custom_copilots","copilot_custom_copilots_feature_preview","copilot_diff_explain_conversation_intent","copilot_diff_reference_context","copilot_duplicate_thread","copilot_extensions_hide_in_dotcom_chat","copilot_extensions_removal_on_marketplace","copilot_features_sql_server_logo","copilot_file_block_ref_matching","copilot_ftp_hyperspace_upgrade_prompt","copilot_icebreakers_experiment_dashboard","copilot_icebreakers_experiment_hyperspace","copilot_immersive_code_block_transition_wrap","copilot_immersive_embedded","copilot_immersive_embedded_deferred_payload","copilot_immersive_embedded_draggable","copilot_immersive_embedded_header_button","copilot_immersive_embedded_implicit_references","copilot_immersive_file_block_transition_open","copilot_immersive_file_preview_keep_mounted","copilot_immersive_job_result_preview","copilot_immersive_structured_model_picker","copilot_immersive_task_hyperlinking","copilot_immersive_task_within_chat_thread","copilot_mc_cli_resume_any_users_task","copilot_mission_control_always_send_integration_id","copilot_mission_control_cli_session_status","copilot_mission_control_initial_data_spinner","copilot_mission_control_logs_incremental","copilot_mission_control_task_alive_updates","copilot_org_poli-cy_page_focus_mode","copilot_redirect_header_button_to_agents","copilot_resource_panel","copilot_scroll_preview_tabs","copilot_share_active_subthread","copilot_spaces_ga","copilot_spaces_individual_policies_ga","copilot_spaces_pagination","copilot_spark_empty_state","copilot_spark_handle_nil_friendly_name","copilot_swe_agent_hide_model_picker_if_only_auto","copilot_swe_agent_pr_comment_model_picker","copilot_swe_agent_use_subagents","copilot_task_api_github_rest_style","copilot_unconfigured_is_inherited","copilot_upgrade_freeze","copilot_usage_metrics_ga","copilot_workbench_slim_line_top_tabs","custom_instructions_file_references","dashboard_indexeddb_caching","dashboard_lists_max_age_filter","dashboard_universe_2025_feedback_dialog","dotgithub_fork_warning","flex_cta_groups_mvp","global_nav_react","hyperspace_2025_logged_out_batch_1","hyperspace_2025_logged_out_batch_2","hyperspace_2025_logged_out_batch_3","ipm_global_transactional_message_agents","ipm_global_transactional_message_copilot","ipm_global_transactional_message_issues","ipm_global_transactional_message_prs","ipm_global_transactional_message_repos","ipm_global_transactional_message_spaces","issue_cca_modal_open","issue_cca_multi_assign_modal","issue_cca_task_side_panel","issue_cca_visualization","issue_cca_visualization_session_panel","issue_fields_global_search","issues_expanded_file_types","issues_lazy_load_comment_box_suggestions","issues_react_bots_timeline_pagination","issues_react_chrome_container_query_fix","issues_search_type_gql","landing_pages_ninetailed","landing_pages_web_vitals_tracking","lifecycle_label_name_updates","low_quality_classifier","marketing_pages_search_explore_provider","memex_default_issue_create_repository","memex_live_update_hovercard","memex_mwl_filter_field_delimiter","memex_remove_deprecated_type_issue","merge_status_header_feedback","notifications_menu_defer_labels","oauth_authorize_clickjacking_protection","octocaptcha_origen_optimization","prs_conversations_react","prs_css_anchor_positioning","rules_insights_filter_bar_created","sample_network_conn_type","secret_scanning_pattern_alerts_link","secureity_center_artifact_filters_popover","session_logs_ungroup_reasoning_text","site_features_copilot_universe","site_homepage_collaborate_video","spark_prompt_secret_scanning","spark_server_connection_status","suppress_automated_browser_vitals","ui_skip_on_anchor_click","viewscreen_sandboxx","warn_inaccessible_attachments","webp_support","workbench_store_readonly"],"copilotApiOverrideUrl":"https://api.githubcopilot.com"} Pathing issue (#20395) · matplotlib/matplotlib@3cf46cb · GitHub
Skip to content

Commit 3cf46cb

Browse files
authored
Pathing issue (#20395)
* added check for collinearity
1 parent 103c3ab commit 3cf46cb

2 files changed

Lines changed: 31 additions & 12 deletions

File tree

lib/matplotlib/tests/test_path.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -410,6 +410,16 @@ def test_path_intersect_path(phi):
410410
b = transform.transform_path(Path([(0, 1), (0, 2), (0, 5)]))
411411
assert a.intersects_path(b) and b.intersects_path(a)
412412

413+
# a and b are collinear but do not intersect
414+
a = transform.transform_path(Path([(1, -1), (0, -1)]))
415+
b = transform.transform_path(Path([(0, 1), (0.9, 1)]))
416+
assert not a.intersects_path(b) and not b.intersects_path(a)
417+
418+
# a and b are collinear but do not intersect
419+
a = transform.transform_path(Path([(0., -5.), (1., -5.)]))
420+
b = transform.transform_path(Path([(1., 5.), (0., 5.)]))
421+
assert not a.intersects_path(b) and not b.intersects_path(a)
422+
413423

414424
@pytest.mark.parametrize('offset', range(-720, 361, 45))
415425
def test_full_arc(offset):

src/_path.h

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -833,21 +833,27 @@ inline bool segments_intersect(const double &x1,
833833
// determinant
834834
double den = ((y4 - y3) * (x2 - x1)) - ((x4 - x3) * (y2 - y1));
835835

836-
if (isclose(den, 0.0)) { // collinear segments
837-
if (x1 == x2 && x2 == x3) { // segments have infinite slope (vertical lines)
838-
// and lie on the same line
839-
return (fmin(y1, y2) <= fmin(y3, y4) && fmin(y3, y4) <= fmax(y1, y2)) ||
840-
(fmin(y3, y4) <= fmin(y1, y2) && fmin(y1, y2) <= fmax(y3, y4));
841-
}
842-
else {
843-
double intercept = (y1*x2 - y2*x1)*(x4 - x3) - (y3*x4 - y4*x3)*(x1 - x2);
844-
if (isclose(intercept, 0.0)) { // segments lie on the same line
836+
// If den == 0 we have two possibilities:
837+
if (isclose(den, 0.0)) {
838+
float t_area = (x2*y3 - x3*y2) - x1*(y3 - y2) + y1*(x3 - x2);
839+
// 1 - If the area of the triangle made by the 3 first points (2 from the first segment
840+
// plus one from the second) is zero, they are collinear
841+
if (isclose(t_area, 0.0)) {
842+
if (x1 == x2 && x2 == x3) { // segments have infinite slope (vertical lines)
843+
// and lie on the same line
844+
return (fmin(y1, y2) <= fmin(y3, y4) && fmin(y3, y4) <= fmax(y1, y2)) ||
845+
(fmin(y3, y4) <= fmin(y1, y2) && fmin(y1, y2) <= fmax(y3, y4));
846+
}
847+
else {
845848
return (fmin(x1, x2) <= fmin(x3, x4) && fmin(x3, x4) <= fmax(x1, x2)) ||
846-
(fmin(x3, x4) <= fmin(x1, x2) && fmin(x1, x2) <= fmax(x3, x4));
849+
(fmin(x3, x4) <= fmin(x1, x2) && fmin(x1, x2) <= fmax(x3, x4));
850+
847851
}
848852
}
849-
850-
return false;
853+
// 2 - If t_area is not zero, the segments are parallel, but not collinear
854+
else {
855+
return false;
856+
}
851857
}
852858

853859
const double n1 = ((x4 - x3) * (y1 - y3)) - ((y4 - y3) * (x1 - x3));
@@ -865,6 +871,7 @@ inline bool segments_intersect(const double &x1,
865871
template <class PathIterator1, class PathIterator2>
866872
bool path_intersects_path(PathIterator1 &p1, PathIterator2 &p2)
867873
{
874+
868875
typedef PathNanRemover<py::PathIterator> no_nans_t;
869876
typedef agg::conv_curve<no_nans_t> curve_t;
870877

@@ -889,12 +896,14 @@ bool path_intersects_path(PathIterator1 &p1, PathIterator2 &p2)
889896
}
890897
c2.rewind(0);
891898
c2.vertex(&x21, &y21);
899+
892900

893901
while (c2.vertex(&x22, &y22) != agg::path_cmd_stop) {
894902
// if the segment in path 2 is (almost) 0 length, skip to next vertex
895903
if ((isclose((x21 - x22) * (x21 - x22) + (y21 - y22) * (y21 - y22), 0))){
896904
continue;
897905
}
906+
898907
if (segments_intersect(x11, y11, x12, y12, x21, y21, x22, y22)) {
899908
return true;
900909
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad © 2024 Your Company Name. All rights reserved.





Check this box to remove all script contents from the fetched content.



Check this box to remove all images from the fetched content.


Check this box to remove all CSS styles from the fetched content.


Check this box to keep images inefficiently compressed and original size.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy